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_in_mongo!(mongo, stack, provider) # logger = DevopsLogger.logger # bootstrap_stack_servers_proc.call(STDOUT, stack, mongo, provider, logger) 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_in_mongo!(mongo, stack, provider) project = mongo.project(stack.project) deploy_env = project.deploy_env(stack.deploy_env) stack_servers = [] stack.resources.each do |resource| logical_name = resource.resource_name extended_info = stack.resource(logical_name) body = { 'name' => logical_name, 'key' => extended_info.key_name } servers = extract_servers(provider, project, deploy_env, body, stack.owner, mongo) servers.each do |server| # TODO: improve IP assigning logic server.private_ip = extended_info.addresses.values.first.first['addr'] end stack_servers += servers end stack_servers.each_with_index do |server, i| server.id = "stack-#{stack.id}-server-#{i+1}" server.stack = stack.id mongo.server_insert server end end end WorkersStorage.add_worker(stack_bootstrap: StackBootstrapWorker)