2016-03-30 12:57:24 +03:00
|
|
|
require 'lib/helpers/job_waiter'
|
2016-03-27 23:37:57 +03:00
|
|
|
require 'workers/bootstrap_worker'
|
|
|
|
|
|
|
|
|
|
# Starts bootstrap workers for each server in group and wait for them to end (synchroniously).
|
2016-03-30 12:57:24 +03:00
|
|
|
class Devops::Executor::StackExecutor
|
2016-04-15 11:08:20 +03:00
|
|
|
class GroupBootstrapper
|
2016-03-30 12:57:24 +03:00
|
|
|
include PutsAndFlush
|
|
|
|
|
attr_reader :out
|
2016-03-27 23:37:57 +03:00
|
|
|
|
2016-03-30 12:57:24 +03:00
|
|
|
class Result < Devops::Helpers::ResultObject
|
2016-04-15 11:08:20 +03:00
|
|
|
set_result_codes timeout_reached: 4
|
|
|
|
|
def one_of_bootstrap_errors?
|
|
|
|
|
false
|
|
|
|
|
end
|
2016-03-30 12:57:24 +03:00
|
|
|
end
|
2016-03-27 23:37:57 +03:00
|
|
|
|
2016-04-22 14:25:08 +03:00
|
|
|
# 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)
|
2016-03-30 12:57:24 +03:00
|
|
|
@server_bootstrap_jobs = {}
|
|
|
|
|
end
|
2016-03-27 23:37:57 +03:00
|
|
|
|
2016-03-30 12:57:24 +03:00
|
|
|
# returns array of Results
|
|
|
|
|
def bootstrap_group
|
|
|
|
|
start_workers!
|
|
|
|
|
::Devops::Db.connector.add_report_subreports(@jid, @server_bootstrap_jobs.values)
|
2016-03-27 23:37:57 +03:00
|
|
|
|
2016-03-30 12:57:24 +03:00
|
|
|
@server_bootstrap_jobs.map do |server_id, job_id|
|
|
|
|
|
result = wait_for_bootstrap_job(job_id)
|
2016-04-15 11:08:20 +03:00
|
|
|
puts_and_flush Devops::Messages.t("stack_executor.group_bootstrapper.result.#{result.reason}", server_id: server_id, job_id: job_id)
|
2016-03-30 12:57:24 +03:00
|
|
|
result
|
|
|
|
|
end
|
2016-03-27 23:37:57 +03:00
|
|
|
end
|
|
|
|
|
|
2016-03-30 12:57:24 +03:00
|
|
|
private
|
2016-03-27 23:37:57 +03:00
|
|
|
|
2016-03-30 12:57:24 +03:00
|
|
|
# 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,
|
2016-04-22 14:25:08 +03:00
|
|
|
skip_rollback: @skip_rollback
|
2016-03-30 12:57:24 +03:00
|
|
|
)
|
|
|
|
|
@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"
|
2016-03-27 23:37:57 +03:00
|
|
|
end
|
|
|
|
|
|
2016-03-30 12:57:24 +03:00
|
|
|
def wait_for_bootstrap_job(job_id)
|
|
|
|
|
result_code = Devops::Helpers::JobWaiter.new(job_id).wait
|
2016-04-15 11:08:20 +03:00
|
|
|
Devops::Executor::ServerOperationResult.new(result_code)
|
2016-03-30 12:57:24 +03:00
|
|
|
rescue Devops::Helpers::JobWaiter::TimeoutReached
|
2016-04-15 11:08:20 +03:00
|
|
|
Result.from_reason(:timeout_reached)
|
2016-03-30 12:57:24 +03:00
|
|
|
end
|
2016-03-27 23:37:57 +03:00
|
|
|
|
|
|
|
|
end
|
|
|
|
|
end
|