require 'set' require "commands/knife_commands" require "commands/deploy" require "exceptions/record_not_found" module ServerCommands include DeployCommands def create_server project, env, params, user, out provider = ::Provider::ProviderFactory.get(env.provider) mongo = ::Devops::Db.connector begin out << "Create server...\n" out.flush if out.respond_to?(:flush) s = Devops::Model::Server.new s.provider = provider.name s.project = project.id s.deploy_env = env.identifier s.run_list = params["run_list"] || [] s.chef_node_name = params["name"] s.key = params["key"] || provider.ssh_key i = mongo.image env.image s.remote_user = i.remote_user s.created_by = user return 3 unless s.create(provider, env.image, env.flavor, env.subnets, env.groups, out) out.flush if out.respond_to?(:flush) DevopsLogger.logger.info "Server with parameters: #{s.to_hash.inspect} is running" unless params["without_bootstrap"] s.run_list = Set.new.merge(project.run_list).merge(env.run_list).merge(s.run_list) key = mongo.key(s.key) s.chef_node_name = provider.create_default_chef_node_name(s) if s.chef_node_name.nil? options = { bootstrap_template: i.bootstrap_template, cert_path: key.path } return two_phase_bootstrap(s, options, out) else return 0 end rescue => e DevopsLogger.logger.error e.message DevopsLogger.logger.warn roll_back(s, provider) mongo.server_delete s.id return 5 end end def two_phase_bootstrap s, options, out provider = ::Provider::ProviderFactory.get(s.provider) mongo = ::Devops::Db.connector out << "\n\nBootstrap...\n" out.flush if out.respond_to?(:flush) options[:run_list] = provider.run_list status = bootstrap(s, options, out) out.flush if out.respond_to?(:flush) if status == 0 DevopsLogger.logger.info "Server with id '#{s.id}' is bootstraped" if check_server(s) out << "Server #{s.chef_node_name} is created" else out << roll_back(s, provider) mongo.server_delete s.id return 5 end out << "\n" out.flush if out.respond_to?(:flush) run_list = s.run_list + provider.run_list out << "\nRun list: #{run_list.inspect}" # s.options[:run_list] += run_list KnifeCommands.set_run_list(s.chef_node_name, run_list) status = deploy_server(out, s, cert_path) if status != 0 msg = "Failed on chef-client with project run list, server with id '#{s.id}'" DevopsLogger.logger.error msg out << "\n" + msg + "\n" end else msg = "Failed while bootstraping server with id '#{s.id}'" DevopsLogger.logger.error msg out << "\n" + msg + "\n" out << roll_back(s, provider) mongo.server_delete s.id end return status end end