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

View File

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

View File

@ -33,18 +33,20 @@ module Devops
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"
uri = Worker.start_async(DeployWorker, @request,
server_attrs: s.to_hash,
owner: owner,
tags: tags,
deploy_info: deploy_info
)
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 = {
@ -59,8 +61,7 @@ module Devops
}
Devops::Db.connector.save_report(Report.new(o))
end
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
files.push uri.to_s
files.push(uri)
end
files
end
@ -106,11 +107,12 @@ module Devops
end
def create_deploy_info server, project, build_number
deploy_env_model = project.deploy_env(server.deploy_env)
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)
@deploy_info_buf[buf_key] = project.deploy_info(deploy_env_model, build_number)
end
end
end

View File

@ -147,18 +147,29 @@ module Devops
def deploy_project id
deploy_env, servers = parser.deploy
dir = DevopsConfig[:report_dir_v2]
files = []
uri = URI.parse(request.url)
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
rescue InvalidPrivileges, RecordNotFound => e
next
end
jid = DeployWorker.perform_async(dir, s.to_hash, [], DevopsConfig.config)
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
files.push uri.to_s
project_model = project(s.project)
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
files
end

View File

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

View File

@ -26,12 +26,12 @@ module Devops
object["stack_template"] = env.stack_template
object["owner"] = parser.current_user
file = Worker.start_async(StackBootstrapWorker, @request,
uri = Worker.start_async(StackBootstrapWorker, @request,
provider_name: env.provider,
stack_attributes: object
)
puts "Syncing report is located here: #{file}"
[file]
puts "Syncing report is located here: #{uri}"
[uri]
end
def stack id
@ -77,29 +77,29 @@ module Devops
owner = parser.current_user
status = []
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
names = body["names"]
tags = body["tags"] || []
dir = DevopsConfig.config[:report_dir_v2]
files = []
jid = nil
uri = URI.parse(parser.request.url)
servers = Devops::Db.connector.stack_servers(stack_id, true)
deploy_info = project.deploy_info(stack.deploy_env, nil)
servers = Devops::Db.connector.stack_servers(id, true)
servers.each do |s|
begin
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"
deploy_info = project.deploy_info(deploy_env_model, nil)
uri = Worker.start_async(DeployWorker, @request,
server_attrs: s.to_hash,
owner: owner,
tags: tags,
deploy_info: deploy_info
)
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}"
dir = DevopsConfig.config[:report_dir_v2]
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 = {
@ -110,15 +110,12 @@ module Devops
"deploy_env" => s.deploy_env,
"type" => Report::DEPLOY_TYPE,
"status" => Worker::STATUS::FAILED
# "attributes" => attributes
}
Devops::Db.connector.save_report(Report.new(o))
end
uri.path = "#{DevopsConfig[:url_prefix]}/v2.0/report/" + jid
files.push uri.to_s
files.push uri
end
files
end
def deploy_stream id, out

View File

@ -91,7 +91,7 @@ module Devops
#
# * *Returns* :
# 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")
if request["X-Stream"]
stream() do |out|

View File

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

View File

@ -28,6 +28,7 @@ class DevopsConfig
end
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
end

View File

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

View File

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