67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "providers/provider_factory"
 | |
| require "commands/stack"
 | |
| require "db/mongo/models/stack/stack_factory"
 | |
| require "db/mongo/models/project"
 | |
| require "db/mongo/models/report"
 | |
| 
 | |
| class StackBootstrapWorker < Worker
 | |
|   include StackCommands
 | |
| 
 | |
|   # besides options came from JobStarter we need:
 | |
|   #   :provider
 | |
|   #   :stack_id
 | |
|   def perform(options)
 | |
|     call(options['config'], options['provider'], options['dir']) do |provider, out, file|
 | |
|       mongo = ::Devops::Db.connector
 | |
|       stack = mongo.stack(options['stack_id'])
 | |
|       save_report(mongo, stack, file)
 | |
| 
 | |
|       sync_bootstrap_proc.call(out, stack, mongo)
 | |
|       persist_stack_servers!(stack, provider)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def save_report(mongo, stack, file)
 | |
|     report = ::Devops::Model::Report.new(
 | |
|       "file" => file,
 | |
|       "_id" => jid,
 | |
|       "created_by" => stack.owner,
 | |
|       "project" => stack.project,
 | |
|       "deploy_env" => stack.deploy_env,
 | |
|       "type" => ::Devops::Model::Report::STACK_TYPE
 | |
|     )
 | |
|     mongo.save_report(report)
 | |
|   end
 | |
| 
 | |
|   def persist_stack_servers!(stack, provider)
 | |
|     mongo = ::Devops::Db.connector
 | |
|     project = mongo.project(stack.project)
 | |
|     deploy_env = project.deploy_env(stack.deploy_env)
 | |
| 
 | |
|     stack.resources.each do |resource|
 | |
|       extended_info = stack.resource(resource.resource_name)
 | |
|       server_attrs = {
 | |
|         'provider' => provider.name,
 | |
|         'project' => project.id,
 | |
|         'deploy_env' => deploy_env.identifier,
 | |
|         'remote_user' => mongo.image(deploy_env.image).remote_user,
 | |
|         'key' => extended_info.key_name || provider.ssh_key,
 | |
|         'id' => extended_info.id,
 | |
|         'chef_node_name' => extended_info.name,
 | |
|         'private_ip' => extended_info.addresses.values.first.first['addr'],
 | |
|         'created_by' => stack.owner,
 | |
|         'run_list' => stack.run_list || [],
 | |
|         'stack' => stack.id
 | |
|       }
 | |
| 
 | |
|       server = ::Devops::Model::Server.new(server_attrs)
 | |
|       mongo.server_insert(server)
 | |
|     end
 | |
|   end
 | |
| 
 | |
| end
 | |
| 
 | |
| WorkersStorage.add_worker(stack_bootstrap: StackBootstrapWorker)
 | 
