require "lib/executors/server_executor" require "commands/status" require "workers/deploy_worker" require "exceptions/deploy_info_error" require "app/api2/parsers/deploy" require_relative "request_handler" module Devops module API2_0 module Handler class Deploy < RequestHandler # extend DeployCommands extend StatusCommands set_parser Devops::API2_0::Parser::DeployParser def deploy body = parser.deploy names = body["names"] tags = body["tags"] || [] run_list = body["run_list"] files = [] jid = nil owner = parser.current_user @deploy_info_buf = {} servers(names).each do |s| project = begin Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner rescue InvalidPrivileges, RecordNotFound => e DevopsLogger.logger.warn e.message next end begin deploy_info = create_deploy_info(s, project, body["build_number"]) deploy_info["run_list"] = run_list if run_list jid = Worker.start_async(DeployWorker, server_attrs: s.to_hash, owner: owner, tags: tags, deploy_info: deploy_info ) rescue DeployInfoError => e msg = "Can not get deploy info: " + e.message DevopsLogger.logger.error msg jid = "error_#{s.chef_node_name}_#{Time.new.to_i}" file = File.jon(dir, jid) File.open(file, "w") do |out| out.write msg end o = { "file" => file, "_id" => jid, "created_by" => owner, "project" => s.project, "deploy_env" => s.deploy_env, "type" => Report::DEPLOY_TYPE, "status" => Worker::STATUS::FAILED # "attributes" => attributes } Devops::Db.connector.save_report(Report.new(o)) end files.push(jid) end files end def deploy_stream out body = parser.deploy names = body["names"] tags = body["tags"] || [] run_list = body["run_list"] status = [] owner = parser.current_user @deploy_info_buf = {} servers(names).each do |s| project = begin Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner rescue InvalidPrivileges, RecordNotFound => e out << e.message + "\n" status.push 2 next end begin deploy_info = create_deploy_info(s, project, body["build_number"]) deploy_info["run_list"] = run_list if run_list res = Devops::Executor::ServerExecutor.new(s, out).deploy_server_with_tags(tags, deploy_info) status.push(res) rescue DeployInfoError => e msg = "Can not get deploy info: " + e.message DevopsLogger.logger.error msg out << msg + "\n" status.push 2 next end end status rescue RecordNotFound => e out << e.message [-10] end def servers names servers = Devops::Db.connector.servers(nil, nil, names, true) raise RecordNotFound.new("No reserved servers found for names '#{names.join("', '")}'") if servers.empty? servers.sort_by!{|s| names.index(s.chef_node_name)} servers end def create_deploy_info server, project, build_number deploy_env_model = project.deploy_env(server.deploy_env) buf_key = "#{server.project}_#{server.deploy_env}" deploy_info = if @deploy_info_buf.key?(buf_key) @deploy_info_buf[buf_key] else @deploy_info_buf[buf_key] = project.deploy_info(deploy_env_model, build_number) end end end end end end