fluke/devops-service/workers/stack_sync_worker.rb
2016-04-05 15:28:17 +03:00

63 lines
1.7 KiB
Ruby

require 'lib/executors/stack_executor'
class StackSyncWorker < Worker
MAX_LOCK_WAITING_TIME = 15000
# @options:
# 'stack_name' required
# 'created_by' optional
def perform(options)
call do
stack_name = options.fetch('stack_name')
created_by = options['created_by'] || ::Devops::Model::Report::SYSTEM_OWNER
@stack = mongo.stack(stack_name)
save_report(created_by)
wait_until_stack_is_unlocked
puts_and_flush 'Persisting new servers.'
executor.persist_new_servers
puts_and_flush "\n\nDeleting stale servers."
executor.delete_stale_servers
puts_and_flush "\n\nBootstrapping just persisted servers."
bootstrap_result = executor.bootstrap_just_persisted(jid)
puts_and_flush Devops::Messages.t("worker.stack_sync.bootstrap_result.#{bootstrap_result.reason}")
bootstrap_result.code
end
end
private
def executor
@executor ||= Devops::Executor::StackExecutor.new(out: out, stack: @stack)
end
def wait_until_stack_is_unlocked
return unless @stack.persisting_is_locked
puts_and_flush 'Stack is locked, waiting...'
waiting_time = 0
sleep_time = 10
loop do
sleep(sleep_time)
@stack = mongo.stack(@stack.name)
return unless @stack.persisting_is_locked
waiting_time += sleep_time
raise "Stack has been locked for too long" if waiting_time > MAX_LOCK_WAITING_TIME
end
end
def save_report(created_by)
update_report(
"created_by" => created_by,
"project" => @stack.project,
"deploy_env" => @stack.deploy_env,
"type" => ::Devops::Model::Report::SYNC_STACK_TYPE,
"subreports" => [],
"stack" => @stack.name
)
end
end