require "commands/deploy" 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"] || [] dir = DevopsConfig.config[:report_dir_v2] files = [] jid = nil uri = URI.parse(parser.request.url) 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"]) jid = DeployWorker.perform_async(dir, s.to_hash, tags, owner, DevopsConfig.config, deploy_info) Worker.set_status jid, Worker::STATUS::IN_QUEUE DevopsLogger.logger.info "Job '#{jid}' has been queued" 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| #unless attributes.nil? # out << "Report attributes: #{attributes.inspect}\n" #end 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"] || [] 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"]) res = deploy_server_proc.call(out, s, 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 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(server.deploy_env, build_number) end end end end end end