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

77 lines
2.1 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
2018-04-04 22:44:39 +03:00
class ServersBootstrapper
include PutsAndFlush
attr_reader :out
class Result < Devops::Helpers::ResultObject
2018-04-04 22:44:39 +03:00
set_result_codes(
ok: 0,
bootstrap_error: 2,
deploy_error: 3,
timeout_reached: 4
)
end
2018-04-04 22:44:39 +03:00
def initialize(out, jid, servers)
@out, @jid, @servers = out, jid, servers
@server_bootstrap_jobs = {}
2018-04-04 22:44:39 +03:00
@parent_task = Devops::Model::JobTask.find(jid)
end
# returns array of Results
def bootstrap_group
start_workers!
2018-04-04 22:44:39 +03:00
@parent_task.add_subtasks(@jid, @server_bootstrap_jobs.values)
@server_bootstrap_jobs.map do |server_id, job_id|
result = wait_for_bootstrap_job(job_id)
2018-04-04 22:44:39 +03:00
puts_and_flush Devops::Messages.t("stack_executor.servers_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,
2018-04-04 22:44:39 +03:00
server_id: server.id,
bootstrap_template: 'omnibus',
2016-04-04 13:17:07 +03:00
owner: server.created_by,
2018-04-04 22:44:39 +03:00
skip_rollback: true
)
@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
2018-04-04 22:44:39 +03:00
def result(reason)
Result.from_reason(reason)
end
def wait_for_bootstrap_job(job_id)
result_code = Devops::Helpers::JobWaiter.new(job_id).wait
2018-04-04 22:44:39 +03:00
result_from_job_code(result_code)
rescue Devops::Helpers::JobWaiter::TimeoutReached
2018-04-04 22:44:39 +03:00
result(:timeout_reached)
end
2018-04-04 22:44:39 +03:00
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
2018-04-04 22:44:39 +03:00
end