Merge branch 'master' into 2525-java-sdk
[arvados.git] / services / api / app / models / pipeline_instance.rb
index 5c60178438e17cf1d2d5927f79875366c78a8793..ca4b69c62a3c58f71a79ff6858c112fcc23e70ab 100644 (file)
@@ -9,8 +9,9 @@ class PipelineInstance < ArvadosModel
 
   before_validation :bootstrap_components
   before_validation :update_success
-  before_create :verify_status
-  before_save :verify_status
+  before_validation :verify_status
+  before_create :set_state_before_save
+  before_save :set_state_before_save
 
   api_accessible :user, extend: :common do |t|
     t.add :pipeline_template_uuid
@@ -39,17 +40,16 @@ class PipelineInstance < ArvadosModel
   end
 
   # if all components have input, the pipeline is Ready
-  def self.is_ready components
-    if !components || components.empty?  # is this correct?
-      return true
+  def components_look_ready?
+    if !self.components || self.components.empty?
+      return false
     end
 
     all_components_have_input = true
-    components.each do |name, component|
-      component['script_parameters'].each do |parametername, parameter|
+    self.components.each do |name, component|
+      component['script_parameters'].andand.each do |parametername, parameter|
         parameter = { 'value' => parameter } unless parameter.is_a? Hash
-        if parameter['value'].nil? and
-            ![false,'false',0,'0'].index parameter['required']
+        if parameter['value'].nil? and parameter['required']
           if parameter['output_of']
             next
           end
@@ -143,7 +143,7 @@ class PipelineInstance < ArvadosModel
       if self.active
         self.state = RunningOnServer
       else
-        if PipelineInstance.is_ready self.components
+        if self.components_look_ready?
           self.state = Ready
         else
           self.state = New
@@ -159,7 +159,7 @@ class PipelineInstance < ArvadosModel
       end
     elsif state_changed?
       case self.state
-      when New, Ready
+      when New, Ready, Paused
         self.active = false
         self.success = nil
       when RunningOnServer
@@ -171,13 +171,16 @@ class PipelineInstance < ArvadosModel
       when Failed
         self.active = false
         self.success = false
+        self.state = Failed   # before_validation will fail if false is returned in the previous line
       when Complete
         self.active = false
         self.success = true
+      else
+        return false
       end
-    else    # new object create or save
+    elsif components_changed?
       if !self.state || self.state == New || !self.active
-        if PipelineInstance.is_ready self.components
+        if self.components_look_ready?
           self.state = Ready
         else
           self.state = New
@@ -186,4 +189,16 @@ class PipelineInstance < ArvadosModel
     end
   end
 
+  def set_state_before_save
+    if !self.state || self.state == New
+      if self.active
+        self.state = RunningOnServer
+      elsif self.components_look_ready?
+        self.state = Ready
+      else
+        self.state = New
+      end
+    end
+  end
+
 end