120 lines
4.1 KiB
Ruby
120 lines
4.1 KiB
Ruby
require "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"] || []
|
|
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 = 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
|
|
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
|
|
|