refactore deploy worker

This commit is contained in:
Anton Chuchkalov 2015-09-02 11:38:58 +03:00
parent 6ade8a015a
commit 8e190d23b4
11 changed files with 87 additions and 56 deletions

View File

@ -28,6 +28,8 @@ class Stack < Handler
when :sync when :sync
sync_handler sync_handler
output output
when :deploy
deploy_handler
when :resources when :resources
resources_handler resources_handler
if @args[3] if @args[3]
@ -112,6 +114,12 @@ class Stack < Handler
end end
end end
def deploy_handler
stack_id = @args[2]
response = post "/stack/#{stack_id}/deploy"
puts response.inspect
end
private private
def provider_stacks(provider) def provider_stacks(provider)

View File

@ -2,7 +2,7 @@ require "devops-client/options/common_options"
class StackOptions < CommonOptions class StackOptions < CommonOptions
commands :create, :delete, :list, :show, :sync, :resources commands :create, :delete, :list, :show, :sync, :resources, :deploy
def initialize args, def_options def initialize args, def_options
super(args, def_options) super(args, def_options)
@ -13,6 +13,7 @@ class StackOptions < CommonOptions
self.delete_params = ["STACK"] self.delete_params = ["STACK"]
self.sync_params = ["STACK"] self.sync_params = ["STACK"]
self.resources_params = ["STACK"] self.resources_params = ["STACK"]
self.deploy_params = ["STACK"]
end end
def create_options def create_options

View File

@ -33,18 +33,20 @@ module Devops
end end
begin begin
deploy_info = create_deploy_info(s, project, body["build_number"]) 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 uri = Worker.start_async(DeployWorker, @request,
DevopsLogger.logger.info "Job '#{jid}' has been queued" server_attrs: s.to_hash,
owner: owner,
tags: tags,
deploy_info: deploy_info
)
rescue DeployInfoError => e rescue DeployInfoError => e
msg = "Can not get deploy info: " + e.message msg = "Can not get deploy info: " + e.message
DevopsLogger.logger.error msg DevopsLogger.logger.error msg
jid = "error_#{s.chef_node_name}_#{Time.new.to_i}" jid = "error_#{s.chef_node_name}_#{Time.new.to_i}"
file = File.jon(dir, jid) file = File.jon(dir, jid)
File.open(file, "w") do |out| File.open(file, "w") do |out|
#unless attributes.nil?
# out << "Report attributes: #{attributes.inspect}\n"
#end
out.write msg out.write msg
end end
o = { o = {
@ -59,8 +61,7 @@ module Devops
} }
Devops::Db.connector.save_report(Report.new(o)) Devops::Db.connector.save_report(Report.new(o))
end end
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid files.push(uri)
files.push uri.to_s
end end
files files
end end
@ -106,11 +107,12 @@ module Devops
end end
def create_deploy_info server, project, build_number def create_deploy_info server, project, build_number
deploy_env_model = project.deploy_env(server.deploy_env)
buf_key = "#{server.project}_#{server.deploy_env}" buf_key = "#{server.project}_#{server.deploy_env}"
deploy_info = if @deploy_info_buf.key?(buf_key) deploy_info = if @deploy_info_buf.key?(buf_key)
@deploy_info_buf[buf_key] @deploy_info_buf[buf_key]
else else
@deploy_info_buf[buf_key] = project.deploy_info(server.deploy_env, build_number) @deploy_info_buf[buf_key] = project.deploy_info(deploy_env_model, build_number)
end end
end end
end end

View File

@ -147,18 +147,29 @@ module Devops
def deploy_project id def deploy_project id
deploy_env, servers = parser.deploy deploy_env, servers = parser.deploy
dir = DevopsConfig[:report_dir_v2]
files = [] files = []
uri = URI.parse(request.url)
servers(id, deploy_env, servers).each do |s| servers(id, deploy_env, servers).each do |s|
project = begin begin
Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
rescue InvalidPrivileges, RecordNotFound => e rescue InvalidPrivileges, RecordNotFound => e
next next
end end
jid = DeployWorker.perform_async(dir, s.to_hash, [], DevopsConfig.config)
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid project_model = project(s.project)
files.push uri.to_s deploy_env_model = project_model.deploy_env(deploy_env)
puts '!!! WARNING !!!'
puts 'build_number is set to empty string'
build_number = ''
deploy_info = project_model.deploy_info(deploy_env_model, build_number)
uri = Worker.start_async(DeployWorker, @request,
server_attrs: s.to_hash,
owner: parser.current_user,
tags: [],
deploy_info: deploy_info
)
files.push uri
end end
files files
end end

View File

@ -67,11 +67,11 @@ module Devops
user = parser.current_user user = parser.current_user
check_if_server_attrs_are_valid(body, user) check_if_server_attrs_are_valid(body, user)
file = Worker.start_async(CreateServerWorker, @request, uri = Worker.start_async(CreateServerWorker, @request,
server_attrs: body, server_attrs: body,
owner: user owner: user
) )
[file] [uri]
end end
def pause_server node_name def pause_server node_name

View File

@ -26,12 +26,12 @@ module Devops
object["stack_template"] = env.stack_template object["stack_template"] = env.stack_template
object["owner"] = parser.current_user object["owner"] = parser.current_user
file = Worker.start_async(StackBootstrapWorker, @request, uri = Worker.start_async(StackBootstrapWorker, @request,
provider_name: env.provider, provider_name: env.provider,
stack_attributes: object stack_attributes: object
) )
puts "Syncing report is located here: #{file}" puts "Syncing report is located here: #{uri}"
[file] [uri]
end end
def stack id def stack id
@ -77,29 +77,29 @@ module Devops
owner = parser.current_user owner = parser.current_user
status = [] status = []
project = Devops::Db.connector.check_project_auth(stack.project, stack.deploy_env, owner) project = Devops::Db.connector.check_project_auth(stack.project, stack.deploy_env, owner)
deploy_env_model = project.deploy_env(stack.deploy_env)
body = parser.deploy body = parser.deploy
names = body["names"] names = body["names"]
tags = body["tags"] || [] tags = body["tags"] || []
dir = DevopsConfig.config[:report_dir_v2]
files = [] files = []
jid = nil jid = nil
uri = URI.parse(parser.request.url) servers = Devops::Db.connector.stack_servers(id, true)
servers = Devops::Db.connector.stack_servers(stack_id, true)
deploy_info = project.deploy_info(stack.deploy_env, nil)
servers.each do |s| servers.each do |s|
begin begin
jid = DeployWorker.perform_async(dir, s.to_hash, tags, owner, DevopsConfig.config, deploy_info) deploy_info = project.deploy_info(deploy_env_model, nil)
Worker.set_status jid, Worker::STATUS::IN_QUEUE uri = Worker.start_async(DeployWorker, @request,
DevopsLogger.logger.info "Job '#{jid}' has been queued" server_attrs: s.to_hash,
owner: owner,
tags: tags,
deploy_info: deploy_info
)
rescue DeployInfoError => e rescue DeployInfoError => e
msg = "Can not get deploy info: " + e.message msg = "Can not get deploy info: " + e.message
DevopsLogger.logger.error msg DevopsLogger.logger.error msg
jid = "error_#{s.chef_node_name}_#{Time.new.to_i}" jid = "error_#{s.chef_node_name}_#{Time.new.to_i}"
dir = DevopsConfig.config[:report_dir_v2]
file = File.jon(dir, jid) file = File.jon(dir, jid)
File.open(file, "w") do |out| File.open(file, "w") do |out|
#unless attributes.nil?
# out << "Report attributes: #{attributes.inspect}\n"
#end
out.write msg out.write msg
end end
o = { o = {
@ -110,15 +110,12 @@ module Devops
"deploy_env" => s.deploy_env, "deploy_env" => s.deploy_env,
"type" => Report::DEPLOY_TYPE, "type" => Report::DEPLOY_TYPE,
"status" => Worker::STATUS::FAILED "status" => Worker::STATUS::FAILED
# "attributes" => attributes
} }
Devops::Db.connector.save_report(Report.new(o)) Devops::Db.connector.save_report(Report.new(o))
end end
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid files.push uri
files.push uri.to_s
end end
files files
end end
def deploy_stream id, out def deploy_stream id, out

View File

@ -91,7 +91,7 @@ module Devops
# #
# * *Returns* : # * *Returns* :
# 200 - Updated # 200 - Updated
app.patch_with_headers "/stack/:id/deploy", :headers => [:accept, :content_type] do |id| app.post_with_headers "/stack/:id/deploy", :headers => [:accept, :content_type] do |id|
check_privileges("stack", "x") check_privileges("stack", "x")
if request["X-Stream"] if request["X-Stream"]
stream() do |out| stream() do |out|

View File

@ -21,7 +21,7 @@ unless File.exists?(config[:devops_dir])
puts "Directory '#{config[:devops_dir]}' has been created" puts "Directory '#{config[:devops_dir]}' has been created"
end end
[:report_dir_v2].each do |key| [:report_dir_v2, :project_info_dir].each do |key|
directory = config[key] directory = config[key]
FileUtils.mkdir_p(directory) unless File.exists?(directory) FileUtils.mkdir_p(directory) unless File.exists?(directory)
end end

View File

@ -28,6 +28,7 @@ class DevopsConfig
end end
config[:report_dir_v2] = File.expand_path(File.join(config[:devops_dir], "report", "v2")) config[:report_dir_v2] = File.expand_path(File.join(config[:devops_dir], "report", "v2"))
config[:project_info_dir] = File.expand_path(File.join(config[:devops_dir], "project_info", "v2"))
DevopsConfig.config = config DevopsConfig.config = config
end end

View File

@ -29,7 +29,7 @@ module Connectors
servers_find(q, f) servers_find(q, f)
end end
def stack_servers(stack_id, reserver=nil, options={}) def stack_servers(stack_id, reserved=nil, options={})
q = {'stack' => stack_id} q = {'stack' => stack_id}
q['reserved_by'] = {'$ne' => nil} unless reserved.nil? q['reserved_by'] = {'$ne' => nil} unless reserved.nil?
list(q, options) list(q, options)

View File

@ -6,25 +6,36 @@ require "db/mongo/models/report"
class DeployWorker < Worker class DeployWorker < Worker
def perform(dir, server, tags, owner, conf, deploy_info) def perform(options)
call(conf, nil, dir) do |provider, out, file| server_attrs = options.fetch('server_attrs')
mongo = Devops::Db.connector owner = options.fetch('owner')
s = Devops::Model::Server.new(server) tags = options.fetch('tags')
o = { deploy_info = options.fetch('deploy_info')
call(nil) do |not_used, out, file|
server = Devops::Model::Server.new(server_attrs)
save_report(file, owner, server)
executor = Devops::Executor::ServerExecutor.new(server, out)
executor.deploy_server_with_tags(tags, deploy_info)
end
end
private
def save_report(file, owner, server)
report = {
"file" => file, "file" => file,
"_id" => jid, "_id" => jid,
"created_by" => owner, "created_by" => owner,
"project" => s.project, "project" => server.project,
"deploy_env" => s.deploy_env, "deploy_env" => server.deploy_env,
"type" => Devops::Model::Report::DEPLOY_TYPE, "type" => Devops::Model::Report::DEPLOY_TYPE,
"status" => STATUS::RUNNING, "status" => STATUS::RUNNING,
"chef_node_name" => s.chef_node_name, "chef_node_name" => server.chef_node_name,
"host" => s.public_ip || s.private_ip "host" => server.public_ip || server.private_ip
} }
mongo.save_report(Devops::Model::Report.new(o)) mongo.save_report(Devops::Model::Report.new(report))
end
status = Devops::Executor::ServerExecutor.new(s, out).deploy_server_with_tags(tags, deploy_info)
status
end
end
end end