validate :find_docker_image_locator
validate :validate_status
validate :validate_state_change
- validate :no_collection_uuids
+ validate :ensure_no_collection_uuids_in_script_params
before_save :update_timestamps_when_state_changes
has_many :commit_ancestors, :foreign_key => :descendant, :primary_key => :script_version
t.add :log
t.add :runtime_constraints
t.add :tasks_summary
- t.add :dependencies
t.add :nondeterministic
t.add :repository
t.add :supplied_script_version
]
def assert_finished
- update_attributes(finished_at: finished_at || Time.now,
+ update_attributes(finished_at: finished_at || db_current_time,
success: success.nil? ? false : success,
running: false)
end
end
end
- def dependencies
- deps = {}
- queue = self.script_parameters.values
- while not queue.empty?
- queue = queue.flatten.compact.collect do |v|
- if v.is_a? Hash
- v.values
- elsif v.is_a? String
- v.match(/^(([0-9a-f]{32})\b(\+[^,]+)?,?)*$/) do |locator|
- deps[locator.to_s] = true
- end
- nil
- end
- end
- end
- deps.keys
- end
-
def permission_to_update
if is_locked_by_uuid_was and !(current_user and
(current_user.uuid == is_locked_by_uuid_was or
# Ensure cancelled_at cannot be set to arbitrary non-now times,
# or changed once it is set.
if self.cancelled_at and not self.cancelled_at_was
- self.cancelled_at = Time.now
+ self.cancelled_at = db_current_time
self.cancelled_by_user_uuid = current_user.uuid
self.cancelled_by_client_uuid = current_api_client.andand.uuid
@need_crunch_dispatch_trigger = true
case state
when Running
- self.started_at ||= Time.now
+ self.started_at ||= db_current_time
when Failed, Complete
- self.finished_at ||= Time.now
+ self.finished_at ||= db_current_time
when Cancelled
- self.cancelled_at ||= Time.now
+ self.cancelled_at ||= db_current_time
end
# TODO: Remove the following case block when old "success" and
end
self.running ||= false # Default to false instead of nil.
+ @need_crunch_dispatch_trigger = true
+
true
end
ok
end
- def no_collection_uuids
+ def ensure_no_collection_uuids_in_script_params
# recursive_hash_search searches recursively through hashes and
# arrays in 'thing' for string fields matching regular expression
# 'pattern'. Returns true if pattern is found, false otherwise.
# Fail validation if any script_parameters field includes a string containing a
# collection uuid pattern.
if self.script_parameters_changed?
- if recursive_hash_search(self.script_parameters, /[a-z0-9]{5}-4zz18-[a-z0-9]{15}/)
+ if recursive_hash_search(self.script_parameters, Collection.uuid_regex)
self.errors.add :script_parameters, "must use portable_data_hash instead of collection uuid"
return false
end