2015-08-12 09:41:19 +03:00
|
|
|
require "lib/executors/server_executor"
|
2014-12-22 14:22:04 +03:00
|
|
|
require "commands/status"
|
|
|
|
|
require "workers/deploy_worker"
|
2015-07-30 15:37:43 +03:00
|
|
|
require "exceptions/deploy_info_error"
|
|
|
|
|
require "app/api2/parsers/deploy"
|
|
|
|
|
require_relative "request_handler"
|
2014-12-22 14:22:04 +03:00
|
|
|
|
|
|
|
|
module Devops
|
2015-07-23 16:56:51 +03:00
|
|
|
module API2_0
|
2014-12-22 14:22:04 +03:00
|
|
|
module Handler
|
2015-07-30 15:37:43 +03:00
|
|
|
class Deploy < RequestHandler
|
2015-08-11 19:47:54 +03:00
|
|
|
# extend DeployCommands
|
2014-12-22 14:22:04 +03:00
|
|
|
extend StatusCommands
|
|
|
|
|
|
2015-07-30 15:37:43 +03:00
|
|
|
set_parser Devops::API2_0::Parser::DeployParser
|
2015-07-23 16:56:51 +03:00
|
|
|
|
2015-07-30 15:37:43 +03:00
|
|
|
def deploy
|
|
|
|
|
body = parser.deploy
|
|
|
|
|
names = body["names"]
|
|
|
|
|
tags = body["tags"] || []
|
2015-09-11 12:22:58 +03:00
|
|
|
run_list = body["run_list"]
|
2016-03-01 17:41:51 +03:00
|
|
|
single_run_chef_client_options = body['chef_client_options']
|
2015-07-23 16:56:51 +03:00
|
|
|
files = []
|
2015-07-30 15:37:43 +03:00
|
|
|
jid = nil
|
|
|
|
|
owner = parser.current_user
|
|
|
|
|
@deploy_info_buf = {}
|
2015-07-23 16:56:51 +03:00
|
|
|
servers(names).each do |s|
|
|
|
|
|
project = begin
|
2015-07-30 15:37:43 +03:00
|
|
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner
|
2015-07-23 16:56:51 +03:00
|
|
|
rescue InvalidPrivileges, RecordNotFound => e
|
2015-07-30 15:37:43 +03:00
|
|
|
DevopsLogger.logger.warn e.message
|
2015-07-23 16:56:51 +03:00
|
|
|
next
|
|
|
|
|
end
|
2015-07-30 15:37:43 +03:00
|
|
|
begin
|
|
|
|
|
deploy_info = create_deploy_info(s, project, body["build_number"])
|
2015-09-11 12:22:58 +03:00
|
|
|
deploy_info["run_list"] = run_list if run_list
|
2016-03-01 17:41:51 +03:00
|
|
|
set_chef_client_options(deploy_info, s, project, single_run_chef_client_options)
|
2015-09-02 11:38:58 +03:00
|
|
|
|
2015-11-03 12:05:07 +03:00
|
|
|
jid = Worker.start_async(DeployWorker,
|
2015-09-02 11:38:58 +03:00
|
|
|
server_attrs: s.to_hash,
|
|
|
|
|
owner: owner,
|
|
|
|
|
tags: tags,
|
|
|
|
|
deploy_info: deploy_info
|
|
|
|
|
)
|
|
|
|
|
|
2015-07-30 15:37:43 +03:00
|
|
|
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
|
2015-11-03 12:05:07 +03:00
|
|
|
files.push(jid)
|
2015-07-23 16:56:51 +03:00
|
|
|
end
|
|
|
|
|
files
|
|
|
|
|
end
|
2014-12-22 14:22:04 +03:00
|
|
|
|
2015-07-30 15:37:43 +03:00
|
|
|
def deploy_stream out
|
|
|
|
|
body = parser.deploy
|
|
|
|
|
names = body["names"]
|
|
|
|
|
tags = body["tags"] || []
|
2015-09-11 12:22:58 +03:00
|
|
|
run_list = body["run_list"]
|
2015-07-23 16:56:51 +03:00
|
|
|
status = []
|
2015-07-30 15:37:43 +03:00
|
|
|
owner = parser.current_user
|
|
|
|
|
@deploy_info_buf = {}
|
2015-07-23 16:56:51 +03:00
|
|
|
servers(names).each do |s|
|
|
|
|
|
project = begin
|
2015-07-30 15:37:43 +03:00
|
|
|
Devops::Db.connector.check_project_auth s.project, s.deploy_env, owner
|
2015-07-23 16:56:51 +03:00
|
|
|
rescue InvalidPrivileges, RecordNotFound => e
|
|
|
|
|
out << e.message + "\n"
|
|
|
|
|
status.push 2
|
|
|
|
|
next
|
2014-12-22 14:22:04 +03:00
|
|
|
end
|
2015-07-30 15:37:43 +03:00
|
|
|
begin
|
|
|
|
|
deploy_info = create_deploy_info(s, project, body["build_number"])
|
2015-09-11 12:22:58 +03:00
|
|
|
deploy_info["run_list"] = run_list if run_list
|
2015-11-23 17:21:43 +03:00
|
|
|
res = Devops::Executor::ServerExecutor.new(s, out, current_user: owner).deploy_server_with_tags(tags, deploy_info)
|
2015-07-30 15:37:43 +03:00
|
|
|
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
|
2015-07-23 16:56:51 +03:00
|
|
|
end
|
2015-07-30 15:37:43 +03:00
|
|
|
status
|
2015-07-23 16:56:51 +03:00
|
|
|
rescue RecordNotFound => e
|
|
|
|
|
out << e.message
|
2015-07-30 15:37:43 +03:00
|
|
|
[-10]
|
2015-07-23 16:56:51 +03:00
|
|
|
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
|
2014-12-22 14:22:04 +03:00
|
|
|
end
|
2015-07-30 15:37:43 +03:00
|
|
|
|
|
|
|
|
def create_deploy_info server, project, build_number
|
2015-09-02 11:38:58 +03:00
|
|
|
deploy_env_model = project.deploy_env(server.deploy_env)
|
2015-07-30 15:37:43 +03:00
|
|
|
buf_key = "#{server.project}_#{server.deploy_env}"
|
|
|
|
|
deploy_info = if @deploy_info_buf.key?(buf_key)
|
|
|
|
|
@deploy_info_buf[buf_key]
|
|
|
|
|
else
|
2015-09-02 11:38:58 +03:00
|
|
|
@deploy_info_buf[buf_key] = project.deploy_info(deploy_env_model, build_number)
|
2015-07-30 15:37:43 +03:00
|
|
|
end
|
|
|
|
|
end
|
2016-03-01 17:41:51 +03:00
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
# env's chef client options may be nil or empty string; it's OK.
|
|
|
|
|
def set_chef_client_options(deploy_info, server, project, single_run_options)
|
|
|
|
|
if single_run_options
|
|
|
|
|
deploy_info['chef_client_options'] = single_run_options
|
|
|
|
|
else
|
|
|
|
|
deploy_info['chef_client_options'] = project.deploy_env(server.deploy_env).chef_client_options
|
|
|
|
|
end
|
|
|
|
|
end
|
2014-12-22 14:22:04 +03:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|