refactore deploy worker
This commit is contained in:
parent
6ade8a015a
commit
8e190d23b4
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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|
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user