From: Jan Provaznik jprovazn@redhat.com
Added frontend_realm dependency and deployment launch method --- src/app/models/deployable.rb | 9 +++++ src/app/models/deployment.rb | 33 ++++++++++++++++++++ src/db/migrate/20110419121917_update_deployment.rb | 9 +++++ src/spec/models/deployment_spec.rb | 16 +++++++++ 4 files changed, 67 insertions(+), 0 deletions(-) create mode 100644 src/db/migrate/20110419121917_update_deployment.rb
diff --git a/src/app/models/deployable.rb b/src/app/models/deployable.rb index f3d954b..25a8737 100644 --- a/src/app/models/deployable.rb +++ b/src/app/models/deployable.rb @@ -83,4 +83,13 @@ class Deployable < ActiveRecord::Base deployments.all? {|d| d.destroyable? } end
+ def launchable? + return false if assemblies.empty? + assemblies.each do |a| + return false if a.templates.empty? + # TODO: should we check if there is an uploaded image for each template in + # assembly? + end + return true + end end diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb index 02324f8..85698d6 100644 --- a/src/app/models/deployment.rb +++ b/src/app/models/deployment.rb @@ -48,6 +48,7 @@ class Deployment < ActiveRecord::Base has_many :instances
belongs_to :realm + belongs_to :frontend_realm belongs_to :owner, :class_name => "User", :foreign_key => "owner_id"
has_many :permissions, :as => :permission_object, :dependent => :destroy, @@ -60,6 +61,7 @@ class Deployment < ActiveRecord::Base validates_presence_of :name validates_uniqueness_of :name, :scope => :pool_id validates_length_of :name, :maximum => 1024 + validates_presence_of :owner_id
before_destroy :destroyable?
@@ -102,4 +104,35 @@ class Deployment < ActiveRecord::Base instances.all? {|i| i.destroyable? } end
+ def launch(hw_profiles, user) + errors = [] + raise "the deployable must have at least one assembly and each assembly must have at least one template" unless deployable.launchable? + deployable.assemblies.each do |assembly| + # TODO: for now we try to start all instances even if some of them fails + begin + Instance.transaction do + instance = Instance.create!( + :deployment => self, + :name => "#{name}/#{assembly.name}", + :frontend_realm => realm, + :pool => pool, + :assembly => assembly, + :state => Instance::STATE_NEW, + :owner => user, + :hardware_profile => HardwareProfile.find(hw_profiles[assembly.id.to_s]) + ) + instance.assign_owner_roles(user) + task = InstanceTask.create!({:user => user, + :task_target => instance, + :action => InstanceTask::ACTION_CREATE}) + condormatic_instance_create(task) + end + rescue + logger.error $! + logger.error $!.backtrace.join("\n ") + errors << "#{assembly.name}: #{$!}" + end + end + errors + end end diff --git a/src/db/migrate/20110419121917_update_deployment.rb b/src/db/migrate/20110419121917_update_deployment.rb new file mode 100644 index 0000000..a33c4ef --- /dev/null +++ b/src/db/migrate/20110419121917_update_deployment.rb @@ -0,0 +1,9 @@ +class UpdateDeployment < ActiveRecord::Migration + def self.up + add_column :deployments, :frontend_realm_id, :integer + end + + def self.down + remove_column :deployments, :frontend_realm_id + end +end diff --git a/src/spec/models/deployment_spec.rb b/src/spec/models/deployment_spec.rb index c8eda13..0d91cd9 100644 --- a/src/spec/models/deployment_spec.rb +++ b/src/spec/models/deployment_spec.rb @@ -55,5 +55,21 @@ describe Deployment do @deployment.get_action_list.should eql(["start", "stop", "reboot"]) end
+ it "should launch instances when launching deployment" do + hwp = Factory(:mock_hwp1) + hwp_ids = {} + @deployment.save! + @deployment.deployable.assemblies.each {|a| hwp_ids[a.id.to_s] = hwp.id} + @deployment.instances.should be_empty + errs = @deployment.launch(hwp_ids, Factory(:user)) + errs.should be_empty + @deployment.instances.count.should == @deployment.deployable.assemblies.count + end + + it "should not launch a deployment if deployable has not assemblies" do + @deployment.save! + @deployment.deployable.assemblies = [] + lambda {@deployment.launch}.should raise_exception + end
end