Merge branch 'master' into 2352-use-state
[arvados.git] / services / api / app / models / pipeline_instance.rb
index fbe36906373c5bbfd93b9e65cf001ab33ca5f8de..258ee2729a54b07bc1eabb9cdd74d0aaffa43baa 100644 (file)
@@ -47,7 +47,7 @@ class PipelineInstance < ArvadosModel
 
     all_components_have_input = true
     self.components.each do |name, component|
-      component['script_parameters'].each do |parametername, parameter|
+      component['script_parameters'].andand.each do |parametername, parameter|
         parameter = { 'value' => parameter } unless parameter.is_a? Hash
         if parameter['value'].nil? and parameter['required']
           if parameter['output_of']
@@ -98,7 +98,7 @@ class PipelineInstance < ArvadosModel
   end
 
   def self.queue
-    self.where('active = true')
+    self.where("active = true or state = 'RunningOnClient'")
   end
 
   protected
@@ -139,28 +139,12 @@ class PipelineInstance < ArvadosModel
   end
 
   def verify_status
-    if active_changed?
-      if self.active
-        self.state = RunningOnServer
-      else
-        if self.components_look_ready?
-          self.state = Ready
-        else
-          self.state = New
-        end
-      end
-    elsif success_changed?
-      if self.success
-        self.active = false
-        self.state = Complete
-      else
-        self.active = false
-        self.state = Failed
-      end
-    elsif state_changed?
+    changed_attributes = self.changed
+
+    if 'state'.in? changed_attributes
       case self.state
       when New, Ready, Paused
-        self.active = false
+        self.active = nil
         self.success = nil
       when RunningOnServer
         self.active = true
@@ -178,8 +162,20 @@ class PipelineInstance < ArvadosModel
       else
         return false
       end
-    elsif components_changed? 
-      if !self.state || self.state == New || !self.active
+    elsif 'success'.in? changed_attributes
+      if self.success
+        self.active = false
+        self.state = Complete
+      else
+        self.active = false
+        self.state = Failed
+      end
+    elsif 'active'.in? changed_attributes
+      if self.active
+        if self.state == New || self.state == Ready || self.state == Paused
+          self.state = RunningOnServer
+        end
+      else
         if self.components_look_ready?
           self.state = Ready
         else
@@ -187,16 +183,20 @@ class PipelineInstance < ArvadosModel
         end
       end
     end
+
+    if 'components'.in? changed_attributes
+      if self.components_look_ready? && (!self.state || self.state == New)
+        self.state = Ready
+      end
+    end
   end
 
   def set_state_before_save
-    if !self.state || self.state == New
+    if !self.state || self.state == New || self.state == Ready || self.state == Paused
       if self.active
         self.state = RunningOnServer
-      elsif self.components_look_ready?
+      elsif self.components_look_ready? && (!self.state || self.state == New)
         self.state = Ready
-      else
-        self.state = New
       end
     end
   end