76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.3 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|
 | |
|       attrs = options['stack_attributes']
 | |
|       mongo = ::Devops::Db.connector
 | |
|       report = ::Devops::Model::Report.new(
 | |
|         "file" => file,
 | |
|         "_id" => jid,
 | |
|         "created_by" => attrs['owner'],
 | |
|         "project" => attrs["project"],
 | |
|         "deploy_env" => attrs["deploy_env"],
 | |
|         "type" => ::Devops::Model::Report::STACK_TYPE
 | |
|       )
 | |
|       mongo.save_report(report)
 | |
| 
 | |
|       stack = Devops::Model::StackFactory.create(options['provider'], options['stack_attributes'], out)
 | |
| #      stack.owner = attrs['owner']
 | |
|       mongo.stack_insert(stack)
 | |
| 
 | |
|       sync_bootstrap_proc.call(out, stack, mongo)
 | |
|       out << "\nStack '#{stack.name}' has been created\n"
 | |
|       out.flush
 | |
|       servers = persist_stack_servers!(stack, provider)
 | |
|       out << attrs.inspect
 | |
|       out << "\n"
 | |
|       unless attrs['without_bootstrap']
 | |
|         statuses = servers.map do |s|
 | |
|           Devops::Executor::ServerExecutor.new(s, out).two_phase_bootstrap({})
 | |
|         end
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def persist_stack_servers!(stack, provider)
 | |
|     mongo = ::Devops::Db.connector
 | |
|     project = mongo.project(stack.project)
 | |
|     deploy_env = project.deploy_env(stack.deploy_env)
 | |
| 
 | |
|     provider.stack_servers(stack).map do |extended_info |
 | |
|       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)
 | |
|       server
 | |
|     end
 | |
|   end
 | |
| 
 | |
| end
 | |
| 
 | |
| WorkersStorage.add_worker(stack_bootstrap: StackBootstrapWorker)
 | 
