Rename is_ready method to components_look_ready? and add additional tests for state...
authorradhika chippada <radhika@curoverse.com>
Tue, 22 Apr 2014 17:48:36 +0000 (13:48 -0400)
committerradhika chippada <radhika@curoverse.com>
Tue, 22 Apr 2014 17:48:36 +0000 (13:48 -0400)
services/api/app/models/pipeline_instance.rb
services/api/test/unit/pipeline_instance_test.rb

index 211b91a0e352d37fbeadd2e8ca6e5171971a6f53..fbe36906373c5bbfd93b9e65cf001ab33ca5f8de 100644 (file)
@@ -40,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|
+    self.components.each do |name, component|
       component['script_parameters'].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
@@ -144,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
@@ -160,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
@@ -172,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
     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
@@ -191,7 +193,7 @@ class PipelineInstance < ArvadosModel
     if !self.state || self.state == New
       if self.active
         self.state = RunningOnServer
-      elsif PipelineInstance.is_ready self.components
+      elsif self.components_look_ready?
         self.state = Ready
       else
         self.state = New
index 219200144ec24237dd94ef78387cce608e372144..20c833fa102c34a9a9b67c67a9a562ca38c69808 100644 (file)
@@ -12,7 +12,7 @@ class PipelineInstanceTest < ActiveSupport::TestCase
     # save the pipeline and expect state to be New
     pi.save
     pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
-    assert_equal PipelineInstance::Ready, pi.state, 'expected state to be New for new pipeline'
+    assert_equal PipelineInstance::New, pi.state, 'expected state to be New for new pipeline'
     assert !pi.active, 'expected active to be false for a new pipeline'
     assert !pi.success, 'expected success to be false for a new pipeline'
   end
@@ -21,7 +21,7 @@ class PipelineInstanceTest < ActiveSupport::TestCase
     pi = pipeline_instances :new_pipeline
 
     # add a component with no input and expect state to be New
-    component = {'script_parameters' => {"input_not_provided" => {"required" => "true"}}}
+    component = {'script_parameters' => {"input_not_provided" => {"required" => true}}}
     pi.components['first'] = component
     components = pi.components
     pi.update_attribute 'components', pi.components
@@ -31,6 +31,17 @@ class PipelineInstanceTest < ActiveSupport::TestCase
     assert !pi.active, 'expected active to be false after update'
     assert !pi.success, 'expected success to be false for a new pipeline'
 
+    # add a component with no input not required
+    component = {'script_parameters' => {"input_not_provided" => {"required" => false}}}
+    pi.components['first'] = component
+    components = pi.components
+    pi.update_attribute 'components', pi.components
+    pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+    assert_equal PipelineInstance::Ready, pi.state, 'expected state to be Ready after adding component with input'
+    assert_equal pi.components.size, 1, 'expected one component'
+    assert !pi.active, 'expected active to be false after update'
+    assert !pi.success, 'expected success to be false for a new pipeline'
+
     # add a component with input and expect state to become Ready
     component = {'script_parameters' => {"input" => "yyyad4b39ca5a924e481008009d94e32+210"}}
     pi.components['first'] = component
@@ -56,12 +67,40 @@ class PipelineInstanceTest < ActiveSupport::TestCase
     assert !pi.active, 'expected active to be false after update'
     assert !pi.success, 'expected success to be false for a new pipeline'
 
-    pi.success = true
+    pi.state = PipelineInstance::RunningOnServer
+    pi.save
+    pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+    assert_equal PipelineInstance::RunningOnServer, pi.state, 'expected state to be RunningOnServer after updating state to RunningOnServer'
+    assert pi.active, 'expected active to be true after update'
+    assert !pi.success, 'expected success to be alse after update'
+
+    pi.state = PipelineInstance::Paused
     pi.save
     pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
-    assert_equal PipelineInstance::Complete, pi.state, 'expected state to be Complete after updating success to true'
+    assert_equal PipelineInstance::Paused, pi.state, 'expected state to be Paused after updating state to Paused'
+    assert !pi.active, 'expected active to be false after update'
+    assert !pi.success, 'expected success to be false after update'
+
+    pi.state = PipelineInstance::Complete
+    pi.save
+    pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+    assert_equal PipelineInstance::Complete, pi.state, 'expected state to be Complete after updating state to Complete'
     assert !pi.active, 'expected active to be false after update'
     assert pi.success, 'expected success to be true after update'
+
+    pi.state = 'bogus'
+    pi.save
+    pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+    assert_equal PipelineInstance::Complete, pi.state, 'expected state to be unchanged with set to a bogus value'
+    assert !pi.active, 'expected active to be false after update'
+    assert pi.success, 'expected success to be true after update'
+
+    pi.state = PipelineInstance::Failed
+    pi.save
+    pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+    assert_equal PipelineInstance::Failed, pi.state, 'expected state to be Failed after updating state to Failed'
+    assert !pi.active, 'expected active to be false after update'
+    assert !pi.success, 'expected success to be false after update'
   end
 
   test "update attributes for pipeline with two components" do
@@ -69,7 +108,7 @@ class PipelineInstanceTest < ActiveSupport::TestCase
 
     # add two components, one with input and one with no input and expect state to be New
     component1 = {'script_parameters' => {"something" => "xxxad4b39ca5a924e481008009d94e32+210", "input" => "c1bad4b39ca5a924e481008009d94e32+210"}}
-    component2 = {'script_parameters' => {"something_else" => "xxxad4b39ca5a924e481008009d94e32+210", "input_missing" => {"required" => "true"}}}
+    component2 = {'script_parameters' => {"something_else" => "xxxad4b39ca5a924e481008009d94e32+210", "input_missing" => {"required" => true}}}
     pi.components['first'] = component1
     pi.components['second'] = component2
     components = pi.components