diff --git a/devops-service/app/api2/handlers/server.rb b/devops-service/app/api2/handlers/server.rb index 6eb4cbd..b21620f 100644 --- a/devops-service/app/api2/handlers/server.rb +++ b/devops-service/app/api2/handlers/server.rb @@ -123,17 +123,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 @@ -152,17 +150,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] @@ -175,6 +172,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) @@ -185,9 +183,11 @@ module Devops unless t.nil? templates = get_templates halt_response("Invalid bootstrap template '#{t}', available values: #{templates.join(", ")}", 400) unless templates.include?(t) + res[: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 d53539d..371d74d 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -193,8 +193,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}" @@ -218,7 +220,13 @@ module Devops bootstrap_options end + def prepare_two_phase_bootstrap options + @out << "Prepare bootstrap...\n" + @out << "Done\n" + end + def two_phase_bootstrap options + prepare_two_phase_bootstrap(options) # bootstrap phase begin provider = @server.provider_instance @@ -230,7 +238,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) @@ -259,7 +268,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 @@ -348,15 +357,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 << json - @out << "\n" - 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 @@ -426,13 +440,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 diff --git a/devops-service/workers/bootstrap_worker.rb b/devops-service/workers/bootstrap_worker.rb index 5fe0856..ba8b2c6 100644 --- a/devops-service/workers/bootstrap_worker.rb +++ b/devops-service/workers/bootstrap_worker.rb @@ -10,16 +10,19 @@ 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) call(provider_name) do |provider, out, file| server = Devops::Model::Server.new(server_attrs) report = save_report(file, owner, server) +=begin options = { bootstrap_template: bootstrap_template } +=end 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 ca91940..d29a30b 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(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 = 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)