refactore deploy worker
This commit is contained in:
parent
6ade8a015a
commit
8e190d23b4
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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')
|
||||||
"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))
|
|
||||||
|
|
||||||
status = Devops::Executor::ServerExecutor.new(s, out).deploy_server_with_tags(tags, deploy_info)
|
call(nil) do |not_used, out, file|
|
||||||
status
|
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
|
||||||
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
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user