Merge branch '#840' into features

This commit is contained in:
amartynov 2015-11-10 12:15:47 +03:00
commit 9dbeacb7d6
4 changed files with 57 additions and 35 deletions

View File

@ -123,17 +123,15 @@ module Devops
# TODO: check bootstrap template name # TODO: check bootstrap template name
def bootstrap_server_stream out def bootstrap_server_stream out
s, rl, bt = prepare_bootstrap_server options = prepare_bootstrap_server
s = options.delete(:server)
status = [] status = []
cert = Devops::Db.connector.key s.key cert = Devops::Db.connector.key s.key
DevopsLogger.logger.debug "Bootstrap certificate path: #{cert.path}" DevopsLogger.logger.debug "Bootstrap certificate path: #{cert.path}"
#bootstrap s, out, cert.path, logger #bootstrap s, out, cert.path, logger
options = { options[:cert_path] = cert.path
:bootstrap_template => bt, executor = Devops::Executor::ServerExecutor.new(s, out)
:cert_path => cert.path, r = executor.two_phase_bootstrap(options)
:run_list => rl
}
r = two_phase_bootstrap s, options, out
str = nil str = nil
r = if check_server(s) r = if check_server(s)
Devops::Db.connector.server_set_chef_node_name s Devops::Db.connector.server_set_chef_node_name s
@ -152,17 +150,16 @@ module Devops
end end
def bootstrap_server def bootstrap_server
server, rl, bootstrap_template = prepare_bootstrap_server options = prepare_bootstrap_server
dir = DevopsConfig[:report_dir_v2] s = options.delete(:server)
files = [] options[:provider_name] = s.provider
uri = URI.parse(@request.url) options[:server_attrs] = s.to_mongo_hash
options[:owner] = parser.current_user
# dir = DevopsConfig[:report_dir_v2]
# files = []
# uri = URI.parse(@request.url)
uri = Worker.start_async(BootstrapWorker, @request, uri = Worker.start_async(BootstrapWorker, @request, options)
provider_name: server.provider,
server_attrs: server.to_mongo_hash,
bootstrap_template: bootstrap_template,
owner: parser.current_user
)
sleep 1 sleep 1
[uri] [uri]
@ -175,6 +172,7 @@ module Devops
rl = body["run_list"] rl = body["run_list"]
t = body["bootstrap_template"] t = body["bootstrap_template"]
s = Devops::Db.connector.server_by_instance_id(id) s = Devops::Db.connector.server_by_instance_id(id)
res = {server: s}
p = Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user p = Devops::Db.connector.check_project_auth s.project, s.deploy_env, parser.current_user
d = p.deploy_env(s.deploy_env) d = p.deploy_env(s.deploy_env)
@ -185,9 +183,11 @@ module Devops
unless t.nil? unless t.nil?
templates = get_templates templates = get_templates
halt_response("Invalid bootstrap template '#{t}', available values: #{templates.join(", ")}", 400) unless templates.include?(t) halt_response("Invalid bootstrap template '#{t}', available values: #{templates.join(", ")}", 400) unless templates.include?(t)
res[:bootstrap_template] = t
end end
s.chef_node_name = name || provider.create_default_chef_node_name(s) s.chef_node_name = name || provider.create_default_chef_node_name(s)
return s, rl || d.run_list, t res[:run_list] = rl || d.run_list
return res
end end
def unbootstrap_server id def unbootstrap_server id

View File

@ -193,8 +193,10 @@ module Devops
@out << "After bootstrap hooks...\n" @out << "After bootstrap hooks...\n"
res = self.run_hook(:after_bootstrap, @out) res = self.run_hook(:after_bootstrap, @out)
@out << "Done\n" @out << "Done\n"
msg = "Server with id '#{@server.id}' is bootstraped"
@out.puts msg
@out.flush @out.flush
DevopsLogger.logger.info "Server with id '#{@server.id}' is bootstraped" DevopsLogger.logger.info msg
r r
else else
@out << "Can not bootstrap node '#{@server.id}', error code: #{r}" @out << "Can not bootstrap node '#{@server.id}', error code: #{r}"
@ -218,7 +220,13 @@ module Devops
bootstrap_options bootstrap_options
end end
def prepare_two_phase_bootstrap options
@out << "Prepare bootstrap...\n"
@out << "Done\n"
end
def two_phase_bootstrap options def two_phase_bootstrap options
prepare_two_phase_bootstrap(options)
# bootstrap phase # bootstrap phase
begin begin
provider = @server.provider_instance provider = @server.provider_instance
@ -230,7 +238,8 @@ module Devops
if check_server if check_server
@out << "Server #{@server.chef_node_name} is created" @out << "Server #{@server.chef_node_name} is created"
else else
@out << roll_back @out.puts "Can not find client or node on chef-server"
roll_back
@out.flush @out.flush
mongo.server_delete @server.id mongo.server_delete @server.id
return result_code(:server_not_in_chef_nodes) return result_code(:server_not_in_chef_nodes)
@ -259,7 +268,7 @@ module Devops
@out << "\nComputed run list: #{run_list.join(", ")}" @out << "\nComputed run list: #{run_list.join(", ")}"
@out.flush @out.flush
@knife_instance.set_run_list(@server.chef_node_name, run_list) @knife_instance.set_run_list(@server.chef_node_name, run_list)
deploy_info = @project.deploy_info(@deploy_env) deploy_info = options[:deploy_info] || @project.deploy_info(@deploy_env)
deploy_status = deploy_server(deploy_info) deploy_status = deploy_server(deploy_info)
if deploy_status == 0 if deploy_status == 0
0 0
@ -348,15 +357,20 @@ module Devops
cmd = "chef-client --no-color" cmd = "chef-client --no-color"
if deploy_info["use_json_file"] if deploy_info["use_json_file"]
deploy_info.delete("use_json_file") deploy_info.delete("use_json_file")
@out << "Deploy Input Parameters:\n" json = nil
json = JSON.pretty_generate(deploy_info)
@out << json
@out << "\n"
file = "#{@server.project}_#{@server.deploy_env}_#{Time.new.to_i}"
dir = DevopsConfig.config[:project_info_dir] dir = DevopsConfig.config[:project_info_dir]
File.open(File.join(dir, file), "w") do |f| file = deploy_info["json_file"] || "#{@server.project}_#{@server.deploy_env}_#{Time.new.to_i}"
f.write json path = File.join(dir, file)
if File.exists?(path)
json = File.read(path)
else
json = JSON.pretty_generate(deploy_info)
File.open(File.join(dir, file), "w") do |f|
f.write json
end
end end
@out << "Deploy Input Parameters:\n"
@out.puts json
@out.flush @out.flush
cmd << " -j http://#{DevopsConfig.config[:address]}:#{DevopsConfig.config[:port]}/#{DevopsConfig.config[:url_prefix]}/v2.0/deploy/data/#{file}" cmd << " -j http://#{DevopsConfig.config[:address]}:#{DevopsConfig.config[:port]}/#{DevopsConfig.config[:url_prefix]}/v2.0/deploy/data/#{file}"
else else
@ -426,13 +440,14 @@ module Devops
end end
def roll_back def roll_back
@out.puts "Trying to roll back..."
unless @server.id.nil? unless @server.id.nil?
@out << "Server '#{@server.chef_node_name}' with id '#{@server.id}' is not created\n" @out.puts "Server '#{@server.chef_node_name}' with id '#{@server.id}' is not created"
@out << delete_from_chef_server(@server.chef_node_name).values.join("\n") @out.puts delete_from_chef_server(@server.chef_node_name).values.join("\n")
begin begin
@out << @server.provider_instance.delete_server(@server) @out.puts @server.provider_instance.delete_server(@server)
rescue => e rescue => e
@out << e.message @out.puts e.message
end end
@out << "\nRolled back\n" @out << "\nRolled back\n"
end end

View File

@ -10,16 +10,19 @@ class BootstrapWorker < Worker
def perform(options) def perform(options)
provider_name = options.fetch('provider_name') provider_name = options.fetch('provider_name')
server_attrs = options.fetch('server_attrs') server_attrs = options.fetch('server_attrs')
bootstrap_template = options.fetch('bootstrap_template') # bootstrap_template = options.fetch('bootstrap_template')
owner = options.fetch('owner') owner = options.fetch('owner')
options = convert_config(options)
call(provider_name) do |provider, out, file| call(provider_name) do |provider, out, file|
server = Devops::Model::Server.new(server_attrs) server = Devops::Model::Server.new(server_attrs)
report = save_report(file, owner, server) report = save_report(file, owner, server)
=begin
options = { options = {
bootstrap_template: bootstrap_template bootstrap_template: bootstrap_template
} }
=end
executor = Devops::Executor::ServerExecutor.new(server, out) executor = Devops::Executor::ServerExecutor.new(server, out)
executor.report = report executor.report = report
status = executor.two_phase_bootstrap(options) status = executor.two_phase_bootstrap(options)

View File

@ -13,6 +13,8 @@ require "core/devops-db"
require "providers/provider_factory" require "providers/provider_factory"
require "lib/knife/knife_factory" require "lib/knife/knife_factory"
# All options keys MUST be a symbol!!!
class Worker class Worker
include Sidekiq::Worker include Sidekiq::Worker
@ -27,7 +29,7 @@ class Worker
end end
def self.start_async(worker_class, request, job_options) def self.start_async(worker_class, request, job_options)
jid = worker_class.perform_async(job_options.dup) jid = worker_class.perform_async(job_options)
Worker.set_status jid, Worker::STATUS::IN_QUEUE Worker.set_status jid, Worker::STATUS::IN_QUEUE
DevopsLogger.logger.info "Job '#{jid}' has been queued" DevopsLogger.logger.info "Job '#{jid}' has been queued"
@ -37,10 +39,12 @@ class Worker
end end
def self.start_sync(worker_class, request, job_options, out) def self.start_sync(worker_class, request, job_options, out)
stringified_options = {} stringified_options = job_options
=begin
job_options.each do |key, value| job_options.each do |key, value|
stringified_options[key.to_s] = value stringified_options[key.to_s] = value
end end
=end
w = worker_class.new w = worker_class.new
w.out = out w.out = out
w.perform(stringified_options) w.perform(stringified_options)