workers
This commit is contained in:
parent
1addbe31b4
commit
d24a0ae927
@ -410,6 +410,10 @@ class MongoConnector
|
||||
Report.new(r)
|
||||
end
|
||||
|
||||
def set_report_status id, status
|
||||
@reports.update({"_id" => id}, {"$set" => {"status" => status, "updated_at" => Time.new}})
|
||||
end
|
||||
|
||||
private
|
||||
def find_server params
|
||||
s = @servers.find(create_query(params)).to_a[0]
|
||||
|
||||
@ -12,44 +12,28 @@ class BootstrapWorker < Worker
|
||||
include ServerCommands
|
||||
|
||||
def perform(dir, e_provider, server, owner, conf)
|
||||
set_status jid, "init"
|
||||
config = convert_config(conf)
|
||||
file = File.join(dir, jid)
|
||||
File.open(file, "w") do |out|
|
||||
begin
|
||||
set_status jid, "running"
|
||||
mongo = mongo_connector(config)
|
||||
::Provider::ProviderFactory.init(config)
|
||||
provider = ::Provider::ProviderFactory.get(e_provider)
|
||||
logger.debug "Provider: #{provider.inspect}"
|
||||
s = Server.new(server)
|
||||
s.options = convert_config(server["options"])
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => owner,
|
||||
"project" => s.project,
|
||||
"deploy_env" => s.deploy_env,
|
||||
"type" => Report::BOOTSTRAP_TYPE
|
||||
}
|
||||
mongo.save_report(Report.new(o))
|
||||
call(conf, e_provider, dir) do |mongo, provider, out, file|
|
||||
s = Server.new(server)
|
||||
s.options = convert_config(server["options"])
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => owner,
|
||||
"project" => s.project,
|
||||
"deploy_env" => s.deploy_env,
|
||||
"type" => Report::BOOTSTRAP_TYPE
|
||||
}
|
||||
mongo.save_report(Report.new(o))
|
||||
|
||||
key = mongo.key(s.key)
|
||||
out << "\nBootstrap with run list: #{s.options[:run_list].inspect}"
|
||||
status = bootstrap(s, out, key.path, logger)
|
||||
if status == 0
|
||||
out << "Chef node name: #{s.chef_node_name}\n"
|
||||
mongo.server_set_chef_node_name s
|
||||
out << "Chef node name has been updated\n"
|
||||
end
|
||||
set_status jid, (status == 0 ? "completed" : "failed")
|
||||
rescue Exception => e
|
||||
out << "\n"
|
||||
out << e.message
|
||||
out << "\n"
|
||||
out << e.backtrace.join("\n")
|
||||
set_status jid, "failed"
|
||||
key = mongo.key(s.key)
|
||||
out << "\nBootstrap with run list: #{s.options[:run_list].inspect}"
|
||||
status = bootstrap(s, out, key.path, logger)
|
||||
if status == 0
|
||||
out << "Chef node name: #{s.chef_node_name}\n"
|
||||
mongo.server_set_chef_node_name s
|
||||
out << "Chef node name has been updated\n"
|
||||
end
|
||||
status
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -12,36 +12,21 @@ class CreateServerWorker < Worker
|
||||
include ServerCommands
|
||||
|
||||
def perform(dir, e_provider, server, owner, conf)
|
||||
set_status jid, "init"
|
||||
config = convert_config(conf)
|
||||
file = File.join(dir, jid)
|
||||
File.open(file, "w") do |out|
|
||||
begin
|
||||
set_status jid, "running"
|
||||
mongo = mongo_connector(config)
|
||||
::Provider::ProviderFactory.init(config)
|
||||
provider = ::Provider::ProviderFactory.get(e_provider)
|
||||
s = Server.new(server)
|
||||
s.options = convert_config(server["options"])
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => owner,
|
||||
"project" => s.project,
|
||||
"deploy_env" => s.deploy_env,
|
||||
"type" => Report::SERVER_TYPE
|
||||
}
|
||||
mongo.save_report(Report.new(o))
|
||||
call(conf, e_provider, dir) do |mongo, provider, out, file|
|
||||
s = Server.new(server)
|
||||
s.options = convert_config(server["options"])
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => owner,
|
||||
"project" => s.project,
|
||||
"deploy_env" => s.deploy_env,
|
||||
"type" => Report::SERVER_TYPE
|
||||
}
|
||||
mongo.save_report(Report.new(o))
|
||||
|
||||
status = create_server_proc.call(out, s, provider, mongo)
|
||||
set_status jid, (status == 0 ? "completed" : "failed")
|
||||
rescue Exception => e
|
||||
out << "\n"
|
||||
out << e.message
|
||||
out << "\n"
|
||||
out << e.backtrace.join("\n")
|
||||
set_status jid, "failed"
|
||||
end
|
||||
status = create_server_proc.call(out, s, provider, mongo)
|
||||
status
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -11,33 +11,20 @@ class DeployWorker < Worker
|
||||
include DeployCommands
|
||||
|
||||
def perform(dir, server, tags, owner, conf)
|
||||
set_status jid, "init"
|
||||
config = convert_config(conf)
|
||||
file = File.join(dir, jid)
|
||||
File.open(file, "w") do |out|
|
||||
begin
|
||||
set_status jid, "running"
|
||||
mongo = mongo_connector(config)
|
||||
s = Server.new(server)
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => owner,
|
||||
"project" => s.project,
|
||||
"deploy_env" => s.deploy_env,
|
||||
"type" => Report::DEPLOY_TYPE
|
||||
}
|
||||
mongo.save_report(Report.new(o))
|
||||
call(conf, nil, dir) do |mongo, provider, out, file|
|
||||
s = Server.new(server)
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => owner,
|
||||
"project" => s.project,
|
||||
"deploy_env" => s.deploy_env,
|
||||
"type" => Report::DEPLOY_TYPE
|
||||
}
|
||||
mongo.save_report(Report.new(o))
|
||||
|
||||
r = deploy_server_proc.call(out, s, mongo, tags)
|
||||
set_status jid, (r == 0 ? "completed" : "failed")
|
||||
rescue Exception => e
|
||||
out << "\n"
|
||||
out << e.message
|
||||
out << "\n"
|
||||
out << e.backtrace.join("\n")
|
||||
set_status jid, "failed"
|
||||
end
|
||||
status = deploy_server_proc.call(out, s, mongo, tags)
|
||||
status
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -13,113 +13,97 @@ class ProjectTestWorker < Worker
|
||||
include StatusCommands
|
||||
|
||||
def perform(dir, params, conf)
|
||||
FileUtils.mkdir_p(dir) unless File.exists?(dir)
|
||||
set_status jid, "init"
|
||||
config = convert_config(conf)
|
||||
file = File.join(dir, jid)
|
||||
File.open(file, "w") do |out|
|
||||
begin
|
||||
set_status jid, "running"
|
||||
logger.info "Test project '#{params["project"]}' and env '#{params["env"]}' (user - #{params["user"]})"
|
||||
mongo = mongo_connector(config)
|
||||
::Provider::ProviderFactory.init(config)
|
||||
project = mongo.project(params["project"])
|
||||
env = project.deploy_env(params["env"])
|
||||
user = params["user"]
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => user,
|
||||
"project" => params["project"],
|
||||
"deploy_env" => params["env"],
|
||||
"type" => Report::PROJECT_TEST_TYPE
|
||||
}
|
||||
mongo.save_report(Report.new(o))
|
||||
call(conf, nil, dir) do |mongo, provider, out, file|
|
||||
logger.info "Test project '#{params["project"]}' and env '#{params["env"]}' (user - #{params["user"]})"
|
||||
project = mongo.project(params["project"])
|
||||
env = project.deploy_env(params["env"])
|
||||
user = params["user"]
|
||||
o = {
|
||||
"file" => file,
|
||||
"_id" => jid,
|
||||
"created_by" => user,
|
||||
"project" => params["project"],
|
||||
"deploy_env" => params["env"],
|
||||
"type" => Report::PROJECT_TEST_TYPE
|
||||
}
|
||||
mongo.save_report(Report.new(o))
|
||||
|
||||
provider = ::Provider::ProviderFactory.get(env.provider)
|
||||
servers = extract_servers(provider, project, env, {}, user, mongo)
|
||||
result = {:servers => []}
|
||||
project.deploy_envs = [ env ]
|
||||
result[:project] = project.to_hash
|
||||
status = 0
|
||||
servers.each do |s|
|
||||
sr = {}
|
||||
t1 = Time.now
|
||||
out << "\n=== Create server ===\n"
|
||||
provider = ::Provider::ProviderFactory.get(env.provider)
|
||||
servers = extract_servers(provider, project, env, {}, user, mongo)
|
||||
result = {:servers => []}
|
||||
project.deploy_envs = [ env ]
|
||||
result[:project] = project.to_hash
|
||||
status = 0
|
||||
servers.each do |s|
|
||||
sr = {}
|
||||
t1 = Time.now
|
||||
out << "\n=== Create server ===\n"
|
||||
out.flush
|
||||
if provider.create_server(s, out)
|
||||
out << "\n=== Create server - OK ===\n"
|
||||
out.flush
|
||||
if provider.create_server(s, out)
|
||||
out << "\n=== Create server - OK ===\n"
|
||||
t2 = Time.now
|
||||
sr[:id] = s.id
|
||||
sr[:create] = {:status => true}
|
||||
sr[:create][:time] = time_diff_s(t1, t2)
|
||||
s.chef_node_name = provider.create_default_chef_node_name(s)
|
||||
logger.info "Server with parameters: #{s.to_hash.inspect} is running"
|
||||
key = mongo.key(s.key)
|
||||
out << "\n=== Bootstrap ===\n"
|
||||
out.flush
|
||||
r = bootstrap(s, out, key.path, logger)
|
||||
t1 = Time.now
|
||||
sr[:chef_node_name] = s.chef_node_name
|
||||
if r == 0
|
||||
out << "\n=== Bootstrap - OK ===\n"
|
||||
out.flush
|
||||
t2 = Time.now
|
||||
sr[:id] = s.id
|
||||
sr[:create] = {:status => true}
|
||||
sr[:create][:time] = time_diff_s(t1, t2)
|
||||
s.chef_node_name = provider.create_default_chef_node_name(s)
|
||||
logger.info "Server with parameters: #{s.to_hash.inspect} is running"
|
||||
key = mongo.key(s.key)
|
||||
out << "\n=== Bootstrap ===\n"
|
||||
sr[:bootstrap] = {:status => true}
|
||||
sr[:bootstrap][:time] = time_diff_s(t2, t1)
|
||||
logger.info "Server with id '#{s.id}' is bootstraped"
|
||||
out << "\n=== Check server ===\n"
|
||||
out.flush
|
||||
r = bootstrap(s, out, key.path, logger)
|
||||
t1 = Time.now
|
||||
sr[:chef_node_name] = s.chef_node_name
|
||||
if r == 0
|
||||
out << "\n=== Bootstrap - OK ===\n"
|
||||
if check_server(s)
|
||||
mongo.server_insert s
|
||||
out << "\n=== OK, server has been inserted ===\n"
|
||||
out.flush
|
||||
sr[:bootstrap] = {:status => true}
|
||||
sr[:bootstrap][:time] = time_diff_s(t2, t1)
|
||||
logger.info "Server with id '#{s.id}' is bootstraped"
|
||||
out << "\n=== Check server ===\n"
|
||||
out.flush
|
||||
if check_server(s)
|
||||
mongo.server_insert s
|
||||
out << "\n=== OK, server has been inserted ===\n"
|
||||
out.flush
|
||||
end
|
||||
else
|
||||
status = 2
|
||||
out << "\n=== Bootstrap - FAIL ===\n"
|
||||
out.flush
|
||||
sr[:bootstrap] = {:status => false}
|
||||
sr[:bootstrap][:return_code] = r
|
||||
end
|
||||
|
||||
t1 = Time.now
|
||||
out << "\n=== Delete server ===\n"
|
||||
out.flush
|
||||
r = delete_from_chef_server(s.chef_node_name)
|
||||
begin
|
||||
r[:server] = provider.delete_server s
|
||||
out << "\n=== Delete server - OK ===\n"
|
||||
out.flush
|
||||
rescue Fog::Compute::OpenStack::NotFound, Fog::Compute::AWS::Error
|
||||
status = 3
|
||||
out << "\n=== Delete server - FAIL ===\n"
|
||||
out.flush
|
||||
r[:server] = "Server with id '#{s.id}' not found in '#{provider.name}' servers"
|
||||
logger.warn r[:server]
|
||||
end
|
||||
mongo.server_delete s.id
|
||||
t2 = Time.now
|
||||
sr[:delete] = {:status => true}
|
||||
sr[:delete][:time] = time_diff_s(t1, t2)
|
||||
else
|
||||
status = 1
|
||||
out << "\n=== Create server - FAIL ===\n"
|
||||
status = 2
|
||||
out << "\n=== Bootstrap - FAIL ===\n"
|
||||
out.flush
|
||||
sr[:create] = {:status => false}
|
||||
sr[:bootstrap] = {:status => false}
|
||||
sr[:bootstrap][:return_code] = r
|
||||
end
|
||||
result[:servers].push sr
|
||||
end
|
||||
out << "\n\n#{result.to_json}"
|
||||
|
||||
set_status jid, (status == 0 ? "completed" : "failed")
|
||||
rescue Exception => e
|
||||
out << "\n"
|
||||
out << e.message
|
||||
out << "\n"
|
||||
out << e.backtrace.join("\n")
|
||||
set_status jid, "failed"
|
||||
t1 = Time.now
|
||||
out << "\n=== Delete server ===\n"
|
||||
out.flush
|
||||
r = delete_from_chef_server(s.chef_node_name)
|
||||
begin
|
||||
r[:server] = provider.delete_server s
|
||||
out << "\n=== Delete server - OK ===\n"
|
||||
out.flush
|
||||
rescue Fog::Compute::OpenStack::NotFound, Fog::Compute::AWS::Error
|
||||
status = 3
|
||||
out << "\n=== Delete server - FAIL ===\n"
|
||||
out.flush
|
||||
r[:server] = "Server with id '#{s.id}' not found in '#{provider.name}' servers"
|
||||
logger.warn r[:server]
|
||||
end
|
||||
mongo.server_delete s.id
|
||||
t2 = Time.now
|
||||
sr[:delete] = {:status => true}
|
||||
sr[:delete][:time] = time_diff_s(t1, t2)
|
||||
else
|
||||
status = 1
|
||||
out << "\n=== Create server - FAIL ===\n"
|
||||
out.flush
|
||||
sr[:create] = {:status => false}
|
||||
end
|
||||
result[:servers].push sr
|
||||
end
|
||||
out << "\n\n#{result.to_json}"
|
||||
status
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@ -4,11 +4,21 @@ $LOAD_PATH.push root unless $LOAD_PATH.include? root
|
||||
require "sidekiq"
|
||||
require "sidekiq/api"
|
||||
|
||||
require "fileutils"
|
||||
|
||||
require "db/mongo/mongo_connector"
|
||||
require "providers/provider_factory"
|
||||
|
||||
class Worker
|
||||
include Sidekiq::Worker
|
||||
|
||||
module STATUS
|
||||
INIT = "init"
|
||||
RUNNING = "running"
|
||||
COMPLETED = "completed"
|
||||
FAILED = "failed"
|
||||
end
|
||||
|
||||
def convert_config conf
|
||||
config = {}
|
||||
conf.each {|k,v| config[k.is_a?(String) ? k.to_sym : k] = v}
|
||||
@ -26,4 +36,41 @@ class Worker
|
||||
Sidekiq.redis {|con| con.hset "devops", id, status}
|
||||
end
|
||||
|
||||
def call conf, e_provider, dir
|
||||
FileUtils.mkdir_p(dir) unless File.exists?(dir)
|
||||
set_status jid, "init"
|
||||
config = convert_config(conf)
|
||||
file = File.join(dir, jid)
|
||||
error = nil
|
||||
mongo = nil
|
||||
provider = nil
|
||||
begin
|
||||
mongo = mongo_connector(config)
|
||||
unless e_provider.nil?
|
||||
::Provider::ProviderFactory.init(config)
|
||||
provider = ::Provider::ProviderFactory.get(e_provider)
|
||||
end
|
||||
rescue Exception => e
|
||||
error = e
|
||||
end
|
||||
File.open(file, "w") do |out|
|
||||
begin
|
||||
set_status jid, STATUS::RUNNING
|
||||
raise error unless error.nil?
|
||||
status = yield(mongo, provider, out, file)
|
||||
status = (status == 0 ? STATUS::COMPLETED : STATUS::FAILED)
|
||||
set_status jid, status
|
||||
mongo.set_report_status(jid, status)
|
||||
status
|
||||
rescue Exception => e
|
||||
out << "\n"
|
||||
out << e.message
|
||||
out << "\n"
|
||||
out << e.backtrace.join("\n")
|
||||
set_status jid, STATUS::FAILED
|
||||
mongo.set_report_status(jid, STATUS::FAILED) unless mongo.nil?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Loading…
Reference in New Issue
Block a user