X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/ffd4738242c61fa5acd423f927339f836dfb0ffb..b1aa6c85c3db947f0963b1bddb2784c115f5c97d:/services/api/app/models/job.rb diff --git a/services/api/app/models/job.rb b/services/api/app/models/job.rb index 9556799aba..2fdfbb1ecf 100644 --- a/services/api/app/models/job.rb +++ b/services/api/app/models/job.rb @@ -1,3 +1,5 @@ +require 'safe_json' + class Job < ArvadosModel include HasUuid include KindAndEtag @@ -147,7 +149,7 @@ class Job < ArvadosModel image_hashes = Array.wrap(operand).flat_map do |search_term| image_search, image_tag = search_term.split(':', 2) Collection. - find_all_for_docker_image(image_search, image_tag, read_users). + find_all_for_docker_image(image_search, image_tag, read_users, filter_compatible_format: false). map(&:portable_data_hash) end filters << [attr, operator.sub(/ docker$/, ""), image_hashes] @@ -284,6 +286,39 @@ class Job < ArvadosModel end end + def cancel(cascade: false, need_transaction: true) + if need_transaction + ActiveRecord::Base.transaction do + cancel(cascade: cascade, need_transaction: false) + end + return + end + + if self.state.in?([Queued, Running]) + self.state = Cancelled + self.save! + elsif self.state != Cancelled + raise InvalidStateTransitionError + end + + return if !cascade + + # cancel all children; they could be jobs or pipeline instances + children = self.components.andand.collect{|_, u| u}.compact + + return if children.empty? + + # cancel any child jobs + Job.where(uuid: children, state: [Queued, Running]).each do |job| + job.cancel(cascade: cascade, need_transaction: false) + end + + # cancel any child pipelines + PipelineInstance.where(uuid: children, state: [PipelineInstance::RunningOnServer, PipelineInstance::RunningOnClient]).each do |pi| + pi.cancel(cascade: cascade, need_transaction: false) + end + end + protected def self.sorted_hash_digest h @@ -390,10 +425,11 @@ class Job < ArvadosModel end def find_docker_image_locator - runtime_constraints['docker_image'] = - Rails.configuration.default_docker_image_for_jobs if ((runtime_constraints.is_a? Hash) and - (runtime_constraints['docker_image']).nil? and - Rails.configuration.default_docker_image_for_jobs) + if runtime_constraints.is_a? Hash + runtime_constraints['docker_image'] ||= + Rails.configuration.default_docker_image_for_jobs + end + resolve_runtime_constraint("docker_image", :docker_image_locator) do |image_search| image_tag = runtime_constraints['docker_image_tag'] @@ -423,7 +459,7 @@ class Job < ArvadosModel output_changed? or log_changed? or tasks_summary_changed? or - state_changed? or + (state_changed? && state != Cancelled) or components_changed? logger.warn "User #{current_user.uuid if current_user} tried to change protected job attributes on locked #{self.class.to_s} #{uuid_was}" return false