69 lines
2.1 KiB
Ruby
69 lines
2.1 KiB
Ruby
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 |