[ARVADOS] updated: a3c5fac3f7849cab38bedd313b522b994be17b15
git at public.curoverse.com
git at public.curoverse.com
Tue Apr 22 00:22:29 EDT 2014
Summary of changes:
services/api/app/models/pipeline_instance.rb | 86 +++++++++++++++++
.../20140422011506_pipeline_instance_state.rb | 85 +++++++++++++++++
services/api/db/schema.rb | 8 +-
services/api/test/fixtures/pipeline_instances.yml | 3 +
services/api/test/unit/pipeline_instance_test.rb | 100 +++++++++++++++++++-
5 files changed, 276 insertions(+), 6 deletions(-)
create mode 100644 services/api/db/migrate/20140422011506_pipeline_instance_state.rb
create mode 100644 services/api/test/fixtures/pipeline_instances.yml
via a3c5fac3f7849cab38bedd313b522b994be17b15 (commit)
from 8bd2381e50d3c575cef3bc0f0d4c10a9bafaf292 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
commit a3c5fac3f7849cab38bedd313b522b994be17b15
Author: radhika chippada <radhika at curoverse.com>
Date: Tue Apr 22 00:20:56 2014 -0400
2352: Add state to pipeline_instance. Db migration and unit testing.
diff --git a/services/api/app/models/pipeline_instance.rb b/services/api/app/models/pipeline_instance.rb
index b16769c..5c60178 100644
--- a/services/api/app/models/pipeline_instance.rb
+++ b/services/api/app/models/pipeline_instance.rb
@@ -4,10 +4,13 @@ class PipelineInstance < ArvadosModel
include CommonApiTemplate
serialize :components, Hash
serialize :properties, Hash
+ serialize :components_summary, Hash
belongs_to :pipeline_template, :foreign_key => :pipeline_template_uuid, :primary_key => :uuid
before_validation :bootstrap_components
before_validation :update_success
+ before_create :verify_status
+ before_save :verify_status
api_accessible :user, extend: :common do |t|
t.add :pipeline_template_uuid
@@ -18,12 +21,46 @@ class PipelineInstance < ArvadosModel
t.add :active
t.add :dependencies
t.add :properties
+ t.add :state
+ t.add :components_summary
end
+ # Supported states for a pipeline instance
+ New = 'New'
+ Ready = 'Ready'
+ RunningOnServer = 'RunningOnServer'
+ RunningOnClient = 'RunningOnClient'
+ Paused = 'Paused'
+ Failed = 'Failed'
+ Complete = 'Complete'
+
def dependencies
dependency_search(self.components).keys
end
+ # if all components have input, the pipeline is Ready
+ def self.is_ready components
+ if !components || components.empty? # is this correct?
+ return true
+ end
+
+ all_components_have_input = true
+ 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['output_of']
+ next
+ end
+ all_components_have_input = false
+ break
+ end
+ end
+ end
+ return all_components_have_input
+ end
+
def progress_table
begin
# v0 pipeline format
@@ -100,4 +137,53 @@ class PipelineInstance < ArvadosModel
{}
end
end
+
+ def verify_status
+ if active_changed?
+ if self.active
+ self.state = RunningOnServer
+ else
+ if PipelineInstance.is_ready self.components
+ 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?
+ case self.state
+ when New, Ready
+ self.active = false
+ self.success = nil
+ when RunningOnServer
+ self.active = true
+ self.success = nil
+ when RunningOnClient
+ self.active = false
+ self.success = nil
+ when Failed
+ self.active = false
+ self.success = false
+ when Complete
+ self.active = false
+ self.success = true
+ end
+ else # new object create or save
+ if !self.state || self.state == New || !self.active
+ if PipelineInstance.is_ready self.components
+ self.state = Ready
+ else
+ self.state = New
+ end
+ end
+ end
+ end
+
end
diff --git a/services/api/db/migrate/20140422011506_pipeline_instance_state.rb b/services/api/db/migrate/20140422011506_pipeline_instance_state.rb
new file mode 100644
index 0000000..a3bc7fe
--- /dev/null
+++ b/services/api/db/migrate/20140422011506_pipeline_instance_state.rb
@@ -0,0 +1,85 @@
+class PipelineInstanceState < ActiveRecord::Migration
+ include CurrentApiClient
+
+ def up
+ if !column_exists?(:pipeline_instances, :state)
+ add_column :pipeline_instances, :state, :string
+ end
+
+ if !column_exists?(:pipeline_instances, :components_summary)
+ add_column :pipeline_instances, :components_summary, :text
+ end
+
+ act_as_system_user do
+ PipelineInstance.all.each do |pi|
+ pi.state = PipelineInstance::New
+
+ if !pi.attribute_present? :success # success is nil
+ if pi[:active] == true
+ pi.state = PipelineInstance::RunningOnServer
+ else
+ if PipelineInstance.is_ready pi.components
+ pi.state = PipelineInstance::Ready
+ else
+ pi.state = PipelineInstance::New
+ end
+ end
+ elsif pi[:success] == true
+ pi.state = PipelineInstance::Complete
+ else
+ pi.state = PipelineInstance::Failed
+ end
+
+ pi.save!
+ end
+ end
+
+=begin
+ if column_exists?(:pipeline_instances, :active)
+ remove_column :pipeline_instances, :active
+ end
+
+ if column_exists?(:pipeline_instances, :success)
+ remove_column :pipeline_instances, :success
+ end
+=end
+ end
+
+ def down
+=begin
+ add_column :pipeline_instances, :success, :boolean, :null => true
+ add_column :pipeline_instances, :active, :boolean, :default => false
+
+ act_as_system_user do
+ PipelineInstance.all.each do |pi|
+ case pi.state
+ when PipelineInstance::New, PipelineInstance::Ready
+ pi.active = false
+ pi.success = nil
+ when PipelineInstance::RunningOnServer
+ pi.active = true
+ pi.success = nil
+ when PipelineInstance::RunningOnClient
+ pi.active = false
+ pi.success = nil
+ when PipelineInstance::Failed
+ pi.active = false
+ pi.success = false
+ when PipelineInstance::Complete
+ pi.active = false
+ pi.success = true
+ end
+ pi.save!
+ end
+ end
+=end
+
+ if column_exists?(:pipeline_instances, :components_summary)
+ remove_column :pipeline_instances, :components_summary
+ end
+
+ if column_exists?(:pipeline_instances, :state)
+ remove_column :pipeline_instances, :state
+ end
+ end
+end
diff --git a/services/api/db/schema.rb b/services/api/db/schema.rb
index e2301e5..ab39901 100644
--- a/services/api/db/schema.rb
+++ b/services/api/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20140407184311) do
+ActiveRecord::Schema.define(:version => 20140422011506) do
create_table "api_client_authorizations", :force => true do |t|
t.string "api_token", :null => false
@@ -311,10 +311,12 @@ ActiveRecord::Schema.define(:version => 20140407184311) do
t.string "pipeline_template_uuid"
t.string "name"
t.text "components"
- t.boolean "success"
- t.boolean "active", :default => false
t.datetime "updated_at"
t.text "properties"
+ t.boolean "active"
+ t.boolean "success"
+ t.string "state"
+ t.text "components_summary"
end
add_index "pipeline_instances", ["created_at"], :name => "index_pipeline_instances_on_created_at"
diff --git a/services/api/test/fixtures/pipeline_instances.yml b/services/api/test/fixtures/pipeline_instances.yml
new file mode 100644
index 0000000..931eb68
--- /dev/null
+++ b/services/api/test/fixtures/pipeline_instances.yml
@@ -0,0 +1,3 @@
+new_pipeline:
+ uuid: zzzzz-xxxxx-f4gneyn6br1xize
+ owner_uuid: zzzzz-tpzed-xurymjxw79nv3jz
diff --git a/services/api/test/unit/pipeline_instance_test.rb b/services/api/test/unit/pipeline_instance_test.rb
index 9b4c7c3..0eb3ff9 100644
--- a/services/api/test/unit/pipeline_instance_test.rb
+++ b/services/api/test/unit/pipeline_instance_test.rb
@@ -1,7 +1,101 @@
require 'test_helper'
class PipelineInstanceTest < ActiveSupport::TestCase
- # test "the truth" do
- # assert true
- # end
+
+ test "check active and success for a pipeline in new state" do
+ pi = pipeline_instances :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'
+ assert !pi.state, 'expected state to be nil because the fixture had no state specified'
+
+ # 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 !pi.active, 'expected active to be false for a new pipeline'
+ assert !pi.success, 'expected success to be false for a new pipeline'
+ end
+
+ test "update attributes for pipeline" do
+ 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"}}}
+ pi.components['first'] = component
+ components = pi.components
+ pi.update_attribute 'components', pi.components
+ pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+ assert_equal PipelineInstance::New, pi.state, 'expected state to be New 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
+ 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'
+
+ pi.active = true
+ pi.save
+ pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+ assert_equal PipelineInstance::RunningOnServer, pi.state, 'expected state to be RunningOnServer after updating active to true'
+ assert pi.active, 'expected active to be true after update'
+ assert !pi.success, 'expected success to be false for a new pipeline'
+
+ pi.success = false
+ pi.save
+ pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+ assert_equal PipelineInstance::Failed, pi.state, 'expected state to be Failed after updating success to false'
+ 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.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 !pi.active, 'expected active to be false after update'
+ assert pi.success, 'expected success to be true after update'
+
+ pi.update_attribute 'active', true
+ pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+ assert_equal PipelineInstance::RunningOnServer, pi.state, 'expected state to be RunningOnServer after updating active to true'
+ assert pi.active, 'expected active to be true after update'
+
+ pi.update_attribute 'success', false
+ pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+ assert_equal PipelineInstance::Failed, pi.state, 'expected state to be Failed after updating success to false'
+ assert !pi.active, 'expected active to be false after update'
+ assert !pi.success, 'expected success to be false for a new pipeline'
+
+ pi.update_attribute 'success', true
+ 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 !pi.active, 'expected active to be false after update'
+ assert pi.success, 'expected success to be true after update'
+ end
+
+ test "update attributes for pipeline with two components" do
+ pi = pipeline_instances :new_pipeline
+
+ # 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"}}}
+ pi.components['first'] = component1
+ pi.components['second'] = component2
+ components = pi.components
+ pi.update_attribute 'components', pi.components
+ pi = PipelineInstance.find_by_uuid 'zzzzz-xxxxx-f4gneyn6br1xize'
+ assert_equal PipelineInstance::New, pi.state, 'expected state to be New after adding component with input'
+ assert_equal pi.components.size, 2, 'expected two components'
+ assert !pi.active, 'expected active to be false after update'
+ assert !pi.success, 'expected success to be false for a new pipeline'
+ end
+
end
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list