fluke/devops-service/app/api2/handlers/deploy.rb

138 lines
4.7 KiB
Ruby
Raw Normal View History

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"]
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
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
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
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