diff --git a/devops-service/commands/server.rb b/devops-service/commands/server.rb index 3c8fac9..be31a95 100644 --- a/devops-service/commands/server.rb +++ b/devops-service/commands/server.rb @@ -49,46 +49,4 @@ module ServerCommands end end - def two_phase_bootstrap s, options, out - provider = ::Provider::ProviderFactory.get(s.provider) - mongo = ::Devops::Db.connector - out << "\n\nBootstrap...\n" - out.flush if out.respond_to?(:flush) - options[:run_list] = provider.run_list - status = bootstrap(s, options, out) - out.flush if out.respond_to?(:flush) - if status == 0 - DevopsLogger.logger.info "Server with id '#{s.id}' is bootstraped" - if check_server(s) - out << "Server #{s.chef_node_name} is created" - else - out << roll_back(s, provider) - mongo.server_delete s.id - return 5 - end - out << "\n" - out.flush if out.respond_to?(:flush) - - run_list = s.run_list + provider.run_list - out << "\nRun list: #{run_list.inspect}" -# s.options[:run_list] += run_list - KnifeCommands.set_run_list(s.chef_node_name, run_list) - status = deploy_server(out, s, cert_path) - if status != 0 - msg = "Failed on chef-client with project run list, server with id '#{s.id}'" - DevopsLogger.logger.error msg - out << "\n" + msg + "\n" - end - else - msg = "Failed while bootstraping server with id '#{s.id}'" - DevopsLogger.logger.error msg - out << "\n" + msg + "\n" - out << roll_back(s, provider) - mongo.server_delete s.id - end - return status - end - - - end diff --git a/devops-service/lib/executors/server_executor.rb b/devops-service/lib/executors/server_executor.rb index 3db40e6..6347d2b 100644 --- a/devops-service/lib/executors/server_executor.rb +++ b/devops-service/lib/executors/server_executor.rb @@ -28,6 +28,7 @@ module Devops @knife_instance = KnifeFactory.instance @server = server @out = out + @out.class.send(:define_method, :flush) { } unless @out.respond_to?(:flush) end def project= p @@ -44,7 +45,7 @@ module Devops mongo = ::Devops::Db.connector begin @out << "Create server...\n" - @out.flush if @out.respond_to?(:flush) + @out.flush @server.run_list = options["run_list"] || [] @server.chef_node_name = options["name"] @@ -61,7 +62,7 @@ module Devops @out << "\nAfter create hooks...\n" res[:after] = self.run_hook :after_create - @out.flush if @out.respond_to?(:flush) + @out.flush DevopsLogger.logger.info "Server with parameters: #{@server.to_hash.inspect} is running" unless options["without_bootstrap"] @server.run_list = Set.new.merge(@project.run_list).merge(@deploy_env.run_list).merge(@server.run_list) @@ -69,7 +70,7 @@ module Devops bootstrap_options = { bootstrap_template: i.bootstrap_template } - return bootstrap(bootstrap_options) + return two_phase_bootstrap(bootstrap_options) else return 0 end @@ -83,6 +84,8 @@ module Devops end def bootstrap options + @out << "\n\nBootstrap...\n" + @out.flush k = Devops::Db.connector.key(@server.key) cert_path = k.path @out << "\nBefore bootstrap hooks...\n" @@ -102,7 +105,7 @@ module Devops @out << "\nPublic IP is present\n" end @out << "\nWaiting for SSH..." - @out.flush if @out.respond_to?(:flush) + @out.flush i = 0 cmd = "ssh -i #{cert_path} -q #{@server.remote_user}@#{ip} 'exit' 2>&1" begin @@ -128,8 +131,10 @@ module Devops @out << "After bootstrap hooks...\n" res = self.run_hook(:after_bootstrap, @out) @out << "Done\n" + DevopsLogger.logger.info "Server with id '#{@server.id}' is bootstraped" else end + @out.flush r end @@ -148,6 +153,42 @@ module Devops bootstrap_options end + def two_phase_bootstrap options + provider = @server.provider_instance + mongo = ::Devops::Db.connector + options[:run_list] = provider.run_list + status = bootstrap(options) + if status == 0 + if check_server + @out << "Server #{@server.chef_node_name} is created" + else + @out << roll_back + mongo.server_delete @server.id + return 5 + end + @out << "\n" + @out.flush + + run_list = @server.run_list + provider.run_list + @out << "\nRun list: #{run_list.inspect}" + # s.options[:run_list] += run_list + @knife_instance.set_run_list(@server.chef_node_name, run_list) + status = deploy_server({}) + if status != 0 + msg = "Failed on chef-client with project run list, server with id '#{@server.id}'" + DevopsLogger.logger.error msg + @out << "\n" + msg + "\n" + end + else + msg = "Failed while bootstraping server with id '#{s.id}'" + DevopsLogger.logger.error msg + @out << "\n" + msg + "\n" + @out << roll_back + mongo.server_delete @server.id + end + return status + end + def check_server @knife_instance.chef_node_list.include?(@server.chef_node_name) and @knife_instance.chef_client_list.include?(@server.chef_node_name) end @@ -218,7 +259,7 @@ module Devops File.open(File.join(dir, file), "w") do |f| f.write json end - @out.flush if @out.respond_to?(:flush) + @out.flush cmd << " -j http://#{DevopsConfig.config[:address]}:#{DevopsConfig.config[:port]}/#{DevopsConfig.config[:url_prefix]}/v2.0/deploy/data/#{file}" end ip = if @server.public_ip.nil? @@ -227,7 +268,7 @@ module Devops @out << "Public IP detected\n" @server.public_ip end - @out.flush if @out.respond_to?(:flush) + @out.flush k = Devops::Db.connector.key(@server.key) lline = @knife_instance.ssh_stream(@out, cmd, ip, @server.remote_user, k.path) r = /Chef\sClient\sfinished/i diff --git a/devops-service/workers/stack_bootstrap_worker.rb b/devops-service/workers/stack_bootstrap_worker.rb index 84f4628..8ab8539 100644 --- a/devops-service/workers/stack_bootstrap_worker.rb +++ b/devops-service/workers/stack_bootstrap_worker.rb @@ -17,7 +17,10 @@ class StackBootstrapWorker < Worker save_report(mongo, stack, file) sync_bootstrap_proc.call(out, stack, mongo) - persist_stack_servers!(stack, provider) + servers = persist_stack_servers!(stack, provider) + statuses = servers.map do |s| + Devops::Executor::ServerExecutor.new(s, out).two_phase_bootstrap({}) + end end end @@ -40,7 +43,7 @@ class StackBootstrapWorker < Worker project = mongo.project(stack.project) deploy_env = project.deploy_env(stack.deploy_env) - stack.resources.each do |resource| + stack.resources.map do |resource| extended_info = stack.resource(resource.resource_name) server_attrs = { 'provider' => provider.name, @@ -58,6 +61,7 @@ class StackBootstrapWorker < Worker server = ::Devops::Model::Server.new(server_attrs) mongo.server_insert(server) + server end end