From ca21238de288067d7a4eb3621922bb7361030d74 Mon Sep 17 00:00:00 2001 From: amartynov Date: Fri, 23 Oct 2015 14:54:56 +0300 Subject: [PATCH 01/13] #840: refactored --- devops-service/app/api2/handlers/server.rb | 36 +++++++++---------- .../lib/executors/server_executor.rb | 4 +++ 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index 18b2e35..cddbf54 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -119,17 +119,15 @@ module Devops # TODO: check bootstrap template name def bootstrap_server_stream out - s, rl, bt = prepare_bootstrap_server + options = prepare_bootstrap_server + s = options.delete[:server] status = [] cert = Devops::Db.connector.key s.key DevopsLogger.logger.debug "Bootstrap certificate path: #{cert.path}" #bootstrap s, out, cert.path, logger - options = { - :bootstrap_template => bt, - :cert_path => cert.path, - :run_list => rl - } - r = two_phase_bootstrap s, options, out + options[:cert_path] = cert.path + executor = Devops::Executor::ServerExecutor.new(s, out) + r = executor.two_phase_bootstrap(options) str = nil r = if check_server(s) Devops::Db.connector.server_set_chef_node_name s @@ -148,17 +146,16 @@ module Devops end def bootstrap_server - server, rl, bootstrap_template = prepare_bootstrap_server - dir = DevopsConfig[:report_dir_v2] - files = [] - uri = URI.parse(@request.url) + options = prepare_bootstrap_server + s = options.delete[:server] + options[:provider_name] = s.provider + 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, - provider_name: server.provider, - server_attrs: server.to_mongo_hash, - bootstrap_template: bootstrap_template, - owner: parser.current_user - ) + uri = Worker.start_async(BootstrapWorker, @request, options) sleep 1 [uri] @@ -171,6 +168,7 @@ module Devops rl = body["run_list"] t = body["bootstrap_template"] 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 d = p.deploy_env(s.deploy_env) @@ -181,9 +179,11 @@ module Devops unless t.nil? templates = get_templates halt_response("Invalid bootstrap template '#{t}', available values: #{templates.join(", ")}", 400) unless templates.include?(t) + s[:bootstrap_template] = t end 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 def unbootstrap_server id diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 1b9e604..bf1e238 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -215,7 +215,11 @@ module Devops bootstrap_options end + def prepare_two_phase_bootstrap options + end + def two_phase_bootstrap options + prepare_two_phase_bootstrap(options) # bootstrap phase begin provider = @server.provider_instance From 1805f8d65cc67d9538d6bc72293d6157c5946389 Mon Sep 17 00:00:00 2001 From: amartynov Date: Fri, 23 Oct 2015 17:14:52 +0300 Subject: [PATCH 02/13] #840: some changes --- devops-service/app/api2/handlers/server.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index cddbf54..2830c55 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -179,7 +179,7 @@ module Devops unless t.nil? templates = get_templates halt_response("Invalid bootstrap template '#{t}', available values: #{templates.join(", ")}", 400) unless templates.include?(t) - s[:bootstrap_template] = t + res[:bootstrap_template] = t end s.chef_node_name = name || provider.create_default_chef_node_name(s) res[:run_list] = rl || d.run_list From 8af43f658d92ebed17c801d3918bdcd709409a85 Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 12:39:54 +0300 Subject: [PATCH 03/13] #840: test --- devops-service/lib/executors/server_executor.rb | 2 ++ devops-service/workers/bootstrap_worker.rb | 3 +++ 2 files changed, 5 insertions(+) diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index bf1e238..429bedb 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -216,6 +216,8 @@ module Devops end def prepare_two_phase_bootstrap options + @out << "Prepare bootstrap...\n" + @out << "Done\n" end def two_phase_bootstrap options diff --git a/devops-service/workers/bootstrap_worker.rb b/devops-service/workers/bootstrap_worker.rb index 5fe0856..eafc303 100644 --- a/devops-service/workers/bootstrap_worker.rb +++ b/devops-service/workers/bootstrap_worker.rb @@ -17,9 +17,12 @@ class BootstrapWorker < Worker server = Devops::Model::Server.new(server_attrs) report = save_report(file, owner, server) +=begin options = { bootstrap_template: bootstrap_template } +=end +out << options.inspect executor = Devops::Executor::ServerExecutor.new(server, out) executor.report = report status = executor.two_phase_bootstrap(options) From a3cb07ab5c2405e80200400dc283b0e800278b6b Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 12:50:31 +0300 Subject: [PATCH 04/13] #840: worker options keys to symbols --- devops-service/workers/worker.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/devops-service/workers/worker.rb b/devops-service/workers/worker.rb index ca91940..4745026 100644 --- a/devops-service/workers/worker.rb +++ b/devops-service/workers/worker.rb @@ -13,6 +13,8 @@ require "core/devops-db" require "providers/provider_factory" require "lib/knife/knife_factory" + +# All options keys MUST be a symbol!!! class Worker include Sidekiq::Worker @@ -27,7 +29,7 @@ class Worker end def self.start_async(worker_class, request, job_options) - jid = worker_class.perform_async(job_options.dup) + jid = worker_class.perform_async(convert_config(job_options)) Worker.set_status jid, Worker::STATUS::IN_QUEUE DevopsLogger.logger.info "Job '#{jid}' has been queued" @@ -37,10 +39,12 @@ class Worker end def self.start_sync(worker_class, request, job_options, out) - stringified_options = {} + stringified_options = convert_config(job_options) +=begin job_options.each do |key, value| stringified_options[key.to_s] = value end +=end w = worker_class.new w.out = out w.perform(stringified_options) From 708a1741dcc9fc6b3f7a3883dd49f7125c309ce5 Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 12:56:50 +0300 Subject: [PATCH 05/13] #840: convert_config is static now --- devops-service/workers/worker.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devops-service/workers/worker.rb b/devops-service/workers/worker.rb index 4745026..493babd 100644 --- a/devops-service/workers/worker.rb +++ b/devops-service/workers/worker.rb @@ -130,7 +130,7 @@ class Worker ::Provider::ProviderFactory.get(provider_name) if provider_name end - def convert_config conf + def self.convert_config conf config = {} conf.each {|k,v| config[k.is_a?(String) ? k.to_sym : k] = v} config From f6b0aa6a8940e3c85581aea616885fa7703aef85 Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 13:16:32 +0300 Subject: [PATCH 06/13] #840: test 2 --- devops-service/workers/bootstrap_worker.rb | 2 ++ devops-service/workers/worker.rb | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/devops-service/workers/bootstrap_worker.rb b/devops-service/workers/bootstrap_worker.rb index eafc303..fe94b85 100644 --- a/devops-service/workers/bootstrap_worker.rb +++ b/devops-service/workers/bootstrap_worker.rb @@ -22,7 +22,9 @@ class BootstrapWorker < Worker bootstrap_template: bootstrap_template } =end +out << "\nFrom bootstrap worker: " out << options.inspect +out << "\n" executor = Devops::Executor::ServerExecutor.new(server, out) executor.report = report status = executor.two_phase_bootstrap(options) diff --git a/devops-service/workers/worker.rb b/devops-service/workers/worker.rb index 493babd..068d3d1 100644 --- a/devops-service/workers/worker.rb +++ b/devops-service/workers/worker.rb @@ -29,7 +29,7 @@ class Worker end def self.start_async(worker_class, request, job_options) - jid = worker_class.perform_async(convert_config(job_options)) + jid = worker_class.perform_async(Worker.convert_config(job_options)) Worker.set_status jid, Worker::STATUS::IN_QUEUE DevopsLogger.logger.info "Job '#{jid}' has been queued" @@ -39,7 +39,7 @@ class Worker end def self.start_sync(worker_class, request, job_options, out) - stringified_options = convert_config(job_options) + stringified_options = Worker.convert_config(job_options) =begin job_options.each do |key, value| stringified_options[key.to_s] = value @@ -133,6 +133,7 @@ class Worker def self.convert_config conf config = {} conf.each {|k,v| config[k.is_a?(String) ? k.to_sym : k] = v} + DevopsLogger.logger.info "Converted options: #{config.inspect}" config end From 02e4ae88d8324df83da20876d7300c1af104e08a Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 13:27:14 +0300 Subject: [PATCH 07/13] #840: convert config in worker instance --- devops-service/workers/bootstrap_worker.rb | 1 + devops-service/workers/worker.rb | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/devops-service/workers/bootstrap_worker.rb b/devops-service/workers/bootstrap_worker.rb index fe94b85..b15f5ef 100644 --- a/devops-service/workers/bootstrap_worker.rb +++ b/devops-service/workers/bootstrap_worker.rb @@ -12,6 +12,7 @@ class BootstrapWorker < Worker server_attrs = options.fetch('server_attrs') bootstrap_template = options.fetch('bootstrap_template') owner = options.fetch('owner') + options = convert_config(options) call(provider_name) do |provider, out, file| server = Devops::Model::Server.new(server_attrs) diff --git a/devops-service/workers/worker.rb b/devops-service/workers/worker.rb index 068d3d1..53342a1 100644 --- a/devops-service/workers/worker.rb +++ b/devops-service/workers/worker.rb @@ -29,7 +29,7 @@ class Worker end def self.start_async(worker_class, request, job_options) - jid = worker_class.perform_async(Worker.convert_config(job_options)) + jid = worker_class.perform_async(job_options) Worker.set_status jid, Worker::STATUS::IN_QUEUE DevopsLogger.logger.info "Job '#{jid}' has been queued" @@ -39,7 +39,7 @@ class Worker end def self.start_sync(worker_class, request, job_options, out) - stringified_options = Worker.convert_config(job_options) + stringified_options = job_options =begin job_options.each do |key, value| stringified_options[key.to_s] = value @@ -130,7 +130,7 @@ class Worker ::Provider::ProviderFactory.get(provider_name) if provider_name end - def self.convert_config conf + def convert_config conf config = {} conf.each {|k,v| config[k.is_a?(String) ? k.to_sym : k] = v} DevopsLogger.logger.info "Converted options: #{config.inspect}" From 02cf7427cfb45b900980365dcf1ac0b1f49bc562 Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 26 Oct 2015 14:51:25 +0300 Subject: [PATCH 08/13] #840: some small fixes --- devops-service/workers/bootstrap_worker.rb | 5 +---- devops-service/workers/worker.rb | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/devops-service/workers/bootstrap_worker.rb b/devops-service/workers/bootstrap_worker.rb index b15f5ef..ba8b2c6 100644 --- a/devops-service/workers/bootstrap_worker.rb +++ b/devops-service/workers/bootstrap_worker.rb @@ -10,7 +10,7 @@ class BootstrapWorker < Worker def perform(options) provider_name = options.fetch('provider_name') server_attrs = options.fetch('server_attrs') - bootstrap_template = options.fetch('bootstrap_template') +# bootstrap_template = options.fetch('bootstrap_template') owner = options.fetch('owner') options = convert_config(options) @@ -23,9 +23,6 @@ class BootstrapWorker < Worker bootstrap_template: bootstrap_template } =end -out << "\nFrom bootstrap worker: " -out << options.inspect -out << "\n" executor = Devops::Executor::ServerExecutor.new(server, out) executor.report = report status = executor.two_phase_bootstrap(options) diff --git a/devops-service/workers/worker.rb b/devops-service/workers/worker.rb index 53342a1..d29a30b 100644 --- a/devops-service/workers/worker.rb +++ b/devops-service/workers/worker.rb @@ -133,7 +133,6 @@ class Worker def convert_config conf config = {} conf.each {|k,v| config[k.is_a?(String) ? k.to_sym : k] = v} - DevopsLogger.logger.info "Converted options: #{config.inspect}" config end From d2bbe96f16661799c9927b33ef584133975558bd Mon Sep 17 00:00:00 2001 From: amartynov Date: Mon, 2 Nov 2015 11:43:57 +0300 Subject: [PATCH 09/13] #840: fixed --- devops-service/app/api2/handlers/server.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index 2830c55..cfa7595 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -120,7 +120,7 @@ module Devops # TODO: check bootstrap template name def bootstrap_server_stream out options = prepare_bootstrap_server - s = options.delete[:server] + s = options.delete(:server) status = [] cert = Devops::Db.connector.key s.key DevopsLogger.logger.debug "Bootstrap certificate path: #{cert.path}" @@ -147,7 +147,7 @@ module Devops def bootstrap_server options = prepare_bootstrap_server - s = options.delete[:server] + s = options.delete(:server) options[:provider_name] = s.provider options[:server_attrs] = s.to_mongo_hash options[:owner] = parser.current_user From e26fa71311a0060b98dc902f9bf21e92572f0d51 Mon Sep 17 00:00:00 2001 From: amartynov Date: Fri, 6 Nov 2015 12:52:31 +0300 Subject: [PATCH 10/13] #840: two_phase_bootstrap option :deploy_info to override project deploy_info --- devops-service/lib/executors/server_executor.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 429bedb..88c9131 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -262,7 +262,7 @@ module Devops @out << "\nComputed run list: #{run_list.join(", ")}" @out.flush @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) if deploy_status == 0 0 @@ -352,8 +352,7 @@ module Devops deploy_info.delete("use_json_file") @out << "Deploy Input Parameters:\n" json = JSON.pretty_generate(deploy_info) - @out << json - @out << "\n" + @out.puts json file = "#{@server.project}_#{@server.deploy_env}_#{Time.new.to_i}" dir = DevopsConfig.config[:project_info_dir] File.open(File.join(dir, file), "w") do |f| From daaa73b8f4edb83ae2494973a132bdaef2dada79 Mon Sep 17 00:00:00 2001 From: amartynov Date: Fri, 6 Nov 2015 13:53:52 +0300 Subject: [PATCH 11/13] #840: additional log --- devops-service/lib/executors/server_executor.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 88c9131..57e7109 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -190,8 +190,10 @@ module Devops @out << "After bootstrap hooks...\n" res = self.run_hook(:after_bootstrap, @out) @out << "Done\n" + msg = "Server with id '#{@server.id}' is bootstraped" + @out.puts msg @out.flush - DevopsLogger.logger.info "Server with id '#{@server.id}' is bootstraped" + DevopsLogger.logger.info msg r else @out << "Can not bootstrap node '#{@server.id}', error code: #{r}" From 84822598a2bbb618da8e44259ab0db379f129ae0 Mon Sep 17 00:00:00 2001 From: amartynov Date: Fri, 6 Nov 2015 14:00:24 +0300 Subject: [PATCH 12/13] #840: some logs --- devops-service/lib/executors/server_executor.rb | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 57e7109..27a072b 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -235,7 +235,8 @@ module Devops if check_server @out << "Server #{@server.chef_node_name} is created" else - @out << roll_back + @out.puts "Can not find client or node on chef-server" + roll_back @out.flush mongo.server_delete @server.id return result_code(:server_not_in_chef_nodes) @@ -429,13 +430,14 @@ module Devops end def roll_back + @out.puts "Trying to roll back..." unless @server.id.nil? - @out << "Server '#{@server.chef_node_name}' with id '#{@server.id}' is not created\n" - @out << delete_from_chef_server(@server.chef_node_name).values.join("\n") + @out.puts "Server '#{@server.chef_node_name}' with id '#{@server.id}' is not created" + @out.puts delete_from_chef_server(@server.chef_node_name).values.join("\n") begin - @out << @server.provider_instance.delete_server(@server) + @out.puts @server.provider_instance.delete_server(@server) rescue => e - @out << e.message + @out.puts e.message end @out << "\nRolled back\n" end From 74a9530888c9c1e5f4a9abc2e9e2db2ac3d400cb Mon Sep 17 00:00:00 2001 From: amartynov Date: Fri, 6 Nov 2015 16:11:28 +0300 Subject: [PATCH 13/13] #840: new deploy_info parameter 'json_file' --- .../lib/executors/server_executor.rb | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 27a072b..febcfed 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -353,14 +353,20 @@ module Devops cmd = "chef-client --no-color" if deploy_info["use_json_file"] deploy_info.delete("use_json_file") - @out << "Deploy Input Parameters:\n" - json = JSON.pretty_generate(deploy_info) - @out.puts json - file = "#{@server.project}_#{@server.deploy_env}_#{Time.new.to_i}" + json = nil dir = DevopsConfig.config[:project_info_dir] - File.open(File.join(dir, file), "w") do |f| - f.write json + file = deploy_info["json_file"] || "#{@server.project}_#{@server.deploy_env}_#{Time.new.to_i}" + 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 + @out << "Deploy Input Parameters:\n" + @out.puts json @out.flush cmd << " -j http://#{DevopsConfig.config[:address]}:#{DevopsConfig.config[:port]}/#{DevopsConfig.config[:url_prefix]}/v2.0/deploy/data/#{file}" else