10903: Add cancel method with cascade to pipeline_instance and update a job's cancel...
[arvados.git] / services / api / app / models / pipeline_instance.rb
index f84c4a310fd19904f4f5f85cdbea23a4c0b83770..651f36d30f16350f2dee5fde0b47bca824184d8f 100644 (file)
@@ -100,6 +100,26 @@ class PipelineInstance < ArvadosModel
     self.where("state = 'RunningOnServer'")
   end
 
+  def cancel cascade=nil
+    if self.state.in?([RunningOnServer, RunningOnClient])
+      self.state = Paused
+      self.save!
+    elsif self.state != Paused
+      raise InvalidStateTransitionError
+    end
+
+    return if !cascade
+
+    # cancel all child jobs
+    children = self.components.andand.collect{|_, c| c['job']}.compact.collect{|j| j['uuid']}.compact
+
+    return if children.empty?
+
+    Job.where(uuid: children).each do |job|
+      job.cancel cascade if job.state.in?([Job::Queued, Job::Running])
+    end
+  end
+
   protected
   def bootstrap_components
     if pipeline_template and (!components or components.empty?)