fluke/devops-service/lib/executors/stack_executor/group_bootstrapper.rb

61 lines
1.9 KiB
Ruby
Raw Normal View History

require 'lib/helpers/job_waiter'
require 'workers/bootstrap_worker'
# Starts bootstrap workers for each server in group and wait for them to end (synchroniously).
class Devops::Executor::StackExecutor
class GroupBootstrapper
include PutsAndFlush
attr_reader :out
class Result < Devops::Helpers::ResultObject
set_result_codes timeout_reached: 4
def one_of_bootstrap_errors?
false
end
end
# TODO: move to keyword arguments
def initialize(options)
@out, @jid, @servers = options.fetch(:out), options.fetch(:jid), options.fetch(:servers)
@skip_rollback = options.fetch(:skip_rollback)
@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("stack_executor.group_bootstrapper.result.#{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',
2016-04-04 13:17:07 +03:00
owner: server.created_by,
skip_rollback: @skip_rollback
)
@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 wait_for_bootstrap_job(job_id)
result_code = Devops::Helpers::JobWaiter.new(job_id).wait
Devops::Executor::ServerOperationResult.new(result_code)
rescue Devops::Helpers::JobWaiter::TimeoutReached
Result.from_reason(:timeout_reached)
end
end
end