fluke/devops-service/workers/stack_sync_worker.rb
Tim Lianov 03dc3d8d99 v3
2018-04-04 22:44:39 +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 |out, task|
stack_name = options.fetch('stack_name')
@created_by = options['created_by'] || ::Devops::Model::JobTask::SYSTEM_OWNER
#TODO: mongoid query
@stack = mongo.stack(stack_name)
set_task_data({
"created_by" => @created_by,
"project" => @stack.project,
"environment" => @stack.environment,
"category" => @stack.category,
"type" => Devops::Model::JobTask::SYNC_STACK_TYPE,
"subtasks" => [],
"stack" => @stack.name
})
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, current_user: @created_by)
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
end