From: Dan Radez <dradez(a)redhat.com>
---
src/app/models/deployment.rb | 156 ++++++++++++++++-------------------------
1 files changed, 61 insertions(+), 95 deletions(-)
diff --git a/src/app/models/deployment.rb b/src/app/models/deployment.rb
index d21345d..9179a24 100644
--- a/src/app/models/deployment.rb
+++ b/src/app/models/deployment.rb
@@ -172,11 +172,18 @@ class Deployment < ActiveRecord::Base
end
def launch(user, config_values = nil)
- if deployable_xml.requires_config_server?
- return launch_in_single_account(user, config_values)
- end
-
+ # first, create all the instance objects,
+ # if a config server is being used
+ # find if there is at least a single account where they can all launch,
+ # then generate the instance configs for the instances,
+ # if a using a config server
+ # then, for each instance send the instance configs to the config server,
+ # and launch the instances
+ #
+ # TODO: need to be able to handle deployable-level errors
+ #
status = { :errors => {}, :successes => {} }
+ assembly_instances = {}
deployable_xml.assemblies.each do |assembly|
# TODO: for now we try to start all instances even if some of them fails
begin
@@ -196,21 +203,65 @@ class Deployment < ActiveRecord::Base
:owner => user,
:hardware_profile => hw_profile
)
+ # store the assembly's parameters
+ assembly.services.each do |service|
+ service.parameters.each do |parameter|
+ if not parameter.reference?
+ param = InstanceParameter.create!(
+ :instance => instance,
+ :service => service.name,
+ :name => parameter.name,
+ :type => parameter.type,
+ :value => parameter.value
+ )
+ end
+ end
+ end
- task = InstanceTask.create!({:user => user,
- :task_target => instance,
- :action => InstanceTask::ACTION_CREATE})
+ assembly_instances[assembly.name] = instance
end
+ rescue
+ logger.error $!.message
+ logger.error $!.backtrace.join("\n ")
+ status[:errors][assembly.name] = $!.message
+ end
+ end
+ if deployable_xml.requires_config_server?
+ # config server specific code
+ matches, errors = Instance.matches(assembly_instances.values)
+ if matches.empty?
+ #TODO:need to have a way to show the errors in a meaningful way
+ status[:errors][name] = errors
+ return status
+ end
+ found = matches.first
+ config_server = found.provider_account.config_server
+ instance_configs = ConfigServerUtil.instance_configs(deployable_xml, config_values,
config_server)
+ end
+ # now actually do the launch
+ assembly_instances.each do |assembly_name, instance|
+ config = instance_configs[assembly_name] if deployable_xml.requires_config_server?
+ begin
+ if deployable_xml.requires_config_server?
+ instance.user_data = config.user_data
+ instance.instance_config_xml = config.to_s
+ instance.save!
+ end
+
+ task = InstanceTask.create!({:user => user,
+ :task_target => instance,
+ :action => InstanceTask::ACTION_CREATE})
+ config_server.send_config(config) if deployable_xml.requires_config_server?
Taskomatic.create_instance(task)
if task.state == Task::STATE_FAILED
- status[:errors][assembly.name] = 'failed'
+ status[:errors][assembly_name] = 'failed'
else
- status[:successes][assembly.name] = 'launched'
+ status[:successes][assembly_name] = 'launched'
end
rescue
logger.error $!.message
logger.error $!.backtrace.join("\n ")
- status[:errors][assembly.name] = $!.message
+ status[:errors][assembly_name] = $!.message
end
end
status
@@ -335,91 +386,6 @@ class Deployment < ActiveRecord::Base
end
private
- def launch_in_single_account(user, config_values = nil)
- # first, create all the instance objects,
- # then find if there is at least a single account where they can all launch,
- # then generate the instance configs for the instances,
- # then, for each instance send the instance configs to the config server,
- # and launch the instance
- #
- # TODO: need to be able to handle deployable-level errors
- #
- status = { :errors => {}, :successes => {} }
- assembly_instances = {}
- deployable_xml.assemblies.each do |assembly|
- begin
- Instance.transaction do
- hw_profile = HardwareProfile.frontend.find_by_name(assembly.hwp)
- raise "Hardware Profile #{assembly.hwp} not found." unless
hw_profile
- instance = Instance.create!(
- :deployment => self,
- :name => "#{name}/#{assembly.name}",
- :frontend_realm => frontend_realm,
- :pool => pool,
- :image_uuid => assembly.image_id,
- :image_build_uuid => assembly.image_build,
- :assembly_xml => assembly.to_s,
- :state => Instance::STATE_NEW,
- :owner => user,
- :hardware_profile => hw_profile
- )
- # store the assembly's parameters
- assembly.services.each do |service|
- service.parameters.each do |parameter|
- if not parameter.reference?
- param = InstanceParameter.create!(
- :instance => instance,
- :service => service.name,
- :name => parameter.name,
- :type => parameter.type,
- :value => parameter.value
- )
- end
- end
- end
-
- assembly_instances[assembly.name] = instance
- end
- rescue
- logger.error $!.message
- logger.error $!.backtrace.join("\n ")
- status[:errors][assembly.name] = $!.message
- end
- end
- matches, errors = Instance.matches(assembly_instances.values)
- if matches.empty?
- #TODO:need to have a way to show the errors in a meaningful way
- status[:errors][name] = errors
- return status
- end
- found = matches.first
- config_server = found.provider_account.config_server
- instance_configs = ConfigServerUtil.instance_configs(deployable_xml, config_values,
config_server)
- assembly_instances.each do |assembly_name, instance|
- config = instance_configs[assembly_name]
- begin
- instance.user_data = config.user_data
- instance.instance_config_xml = config.to_s
- instance.save!
- task = InstanceTask.create!({:user => user,
- :task_target => instance,
- :action => InstanceTask::ACTION_CREATE})
- config_server.send_config(config)
- Taskomatic.create_instance(task)
- if task.state == Task::STATE_FAILED
- status[:errors][assembly_name] = 'failed'
- else
- status[:successes][assembly_name] = 'launched'
- end
- rescue
- logger.error $!.message
- logger.error $!.backtrace.join("\n ")
- status[:errors][assembly_name] = $!.message
- end
- end
- status
- end
-
def inject_launch_parameters
launch_parameters.each_pair do |assembly, svcs|
svcs.each_pair do |service, params|
--
1.7.4.4