require 'workers/bootstrap_worker' require "workers/stack_bootstrap/errors" class StackServersBootstrapper include PutsAndFlush attr_reader :out def initialize(out, jid) @out, @jid = out, jid end def bootstrap(servers) @servers = servers puts_and_flush "\nStart bootstraping stack servers" servers_jobs_ids = start_workers ::Devops::Db.connector.add_report_subreports(@jid, servers_jobs_ids.values) out.puts servers_jobs_ids.each do |server_id, subreport_id| job_result_code = wait_for_job(server_id, subreport_id) check_job_result!(server_id, job_result_code) end puts_and_flush "Stack servers have been bootstraped" end private def check_job_result!(server_id, job_result_code) return if job_result_code == 0 reason = Devops::Executor::ServerExecutor.reason_from_error_code(job_result_code) puts_and_flush "Operation result for #{server_id}: #{reason}" if error_occured_during_bootstrap?(reason) raise StackServerBootstrapError # will cause rollback of a stack else raise StackServerDeployError #will not cause rollback of a stack end end def error_occured_during_bootstrap?(reason) Devops::Executor::ServerExecutor.bootstrap_errors_reasons.include?(reason) end def wait_for_job(server_id, subreport_id) 1000.times do sleep(5) subreport = ::Devops::Db.connector.report(subreport_id) case subreport.status when Worker::STATUS::COMPLETED puts_and_flush "Server '#{server_id}' has been bootstraped with job #{subreport_id}" return 0 when Worker::STATUS::FAILED puts_and_flush "Server '#{server_id}' hasn't been bootstraped with job #{subreport_id}. Job result code is '#{subreport.job_result_code}'" return subreport.job_result_code end end puts_and_flush "Waiting for job #{subreport_id} halted: timeout reached." raise StackServerBootstrapDeployTimeout end # returns hash: {server_id => worker_job_id} def start_workers servers_jobs_ids = {} @servers.each do |server| job_id = Worker.start_async(::BootstrapWorker, server_attrs: server.to_mongo_hash, bootstrap_template: 'omnibus', owner: server.created_by ) @out.puts "Bootstraping server '#{server.id}'... job id: #{job_id}" servers_jobs_ids[server.id] = job_id end puts_and_flush "\n" servers_jobs_ids end end