require 'workers/bootstrap_worker' require 'workers/stack_bootstrap/errors' require 'workers/helpers/job_waiter' 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, job_id| bootstrap_result_code = get_bootstrap_result(server_id, job_id) check_bootstrap_result!(server_id, bootstrap_result_code, job_id) end puts_and_flush "Stack servers have been bootstraped" end private def check_bootstrap_result!(server_id, result_code, job_id) operation_result = Devops::Executor::ServerOperationResult.new(result_code) if operation_result.ok? puts_and_flush "Server '#{server_id}' has been bootstraped (job #{job_id})." return end puts_and_flush "Server '#{server_id}' bootstraped failed (job #{job_id}). Reason: #{operation_result.reason}" if operation_result.occured_during_bootstrap?(operation_result.code) raise StackServerBootstrapError # will cause rollback of a stack else raise StackServerDeployError # will not cause rollback of a stack end end def get_bootstrap_result(server_id, job_id) JobWaiter.new(job_id).wait rescue JobWaiter::TimeoutReached puts_and_flush "Waiting for job #{job_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