From: Jan Provaznik <jprovazn(a)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 {(a)deployment.launch}.should raise_exception
+ end
end
--
1.7.4