72 lines
1.9 KiB
Ruby
72 lines
1.9 KiB
Ruby
require 'workers/bootstrap_worker'
|
|
require 'workers/helpers/job_waiter'
|
|
|
|
# Starts bootstrap workers for each server in group and wait for them to end (synchroniously).
|
|
class ServersBootstrapper
|
|
include PutsAndFlush
|
|
attr_reader :out
|
|
|
|
class Result < Devops::Helpers::ResultObject
|
|
set_result_codes(
|
|
ok: 0,
|
|
bootstrap_error: 2,
|
|
deploy_error: 3,
|
|
timeout_reached: 4
|
|
)
|
|
end
|
|
|
|
def initialize(out, jid, servers)
|
|
@out, @jid, @servers = out, jid, servers
|
|
@server_bootstrap_jobs = {}
|
|
end
|
|
|
|
# returns array of Results
|
|
def bootstrap_group
|
|
start_workers!
|
|
::Devops::Db.connector.add_report_subreports(@jid, @server_bootstrap_jobs.values)
|
|
|
|
@server_bootstrap_jobs.map do |server_id, job_id|
|
|
result = wait_for_bootstrap_job(job_id)
|
|
puts_and_flush Devops::Messages.t("worker.servers_bootstrapper.bootstrap_servers.#{result.reason}", server_id: server_id, job_id: job_id)
|
|
result
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
# returns hash: {server_id => worker_job_id}
|
|
def start_workers!
|
|
@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 "Start bootstraping server '#{server.id}' job (job id: #{job_id})."
|
|
@server_bootstrap_jobs[server.id] = job_id
|
|
end
|
|
puts_and_flush "\n\n\n"
|
|
end
|
|
|
|
def result(reason)
|
|
Result.from_reason(reason)
|
|
end
|
|
|
|
def wait_for_bootstrap_job(job_id)
|
|
result_code = JobWaiter.new(job_id).wait
|
|
result_from_job_code(result_code)
|
|
rescue JobWaiter::TimeoutReached
|
|
result(:timeout_reached)
|
|
end
|
|
|
|
def result_from_job_code(result_code)
|
|
job_result = Devops::Executor::ServerOperationResult.new(result_code)
|
|
if job_result.ok?
|
|
result(:ok)
|
|
elsif job_result.one_of_bootstrap_errors?
|
|
result(:bootstrap_error)
|
|
else
|
|
result(:deploy_error)
|
|
end
|
|
end
|
|
end |