fluke/devops-service/workers/stack_bootstrap_worker.rb
2016-03-29 20:09:05 +03:00

92 lines
2.7 KiB
Ruby

require "db/mongo/models/stack/stack_factory"
require "db/mongo/models/project"
require "workers/stack_bootstrap/stack_creation_waiter"
require "workers/stack_bootstrap/servers_bootstrapper"
require "workers/stack_bootstrap/stack_servers_persister"
class StackBootstrapWorker < Worker
# options must contain 'stack_attributes'
def perform(options)
call do
stack_attrs = options.fetch('stack_attributes')
without_bootstrap = stack_attrs.delete('without_bootstrap')
@out.puts "Received 'without_bootstrap' option" if without_bootstrap
save_report(stack_attrs)
@stack = create_stack(stack_attrs)
if !wait_till_stack_is_created
puts_and_flush "Stack creating error"
return 1
end
begin
@servers_by_priorities = persist_stack_servers
return 0 if without_bootstrap
bootstrap_result = bootstrap_servers_by_priority
puts_and_flush Devops::Messages.t("worker.stack_bootstrap.bootstrap_result.#{bootstrap_result.reason}")
rollback_stack!(@stack) if bootstrap_result.bootstrap_error?
bootstrap_result.code
rescue StandardError => e
puts_and_flush "\nAn error occured."
rollback_stack!(@stack)
raise e
end
end
end
private
def persist_stack_servers
StackServersPersister.new(@stack, out).persist
end
def bootstrap_servers_by_priority
PrioritizedGroupsBootstrapper.new(out, jid, @servers_by_priorities).bootstrap_servers_by_priority
end
# builds and persist stack model, initiate stack creating in cloud
def create_stack(stack_attrs)
stack = Devops::Model::StackFactory.create(stack_attrs["provider"], stack_attrs, @out)
mongo.stack_insert(stack)
end
def wait_till_stack_is_created
wait_result = StackCreationWaiter.new(@stack, out).sync
if wait_result.ok?
puts_and_flush "\nStack '#{@stack.name}' has been created"
true
else
puts_and_flush "An error ocurred during stack creation: #{wait_result.reason}"
false
end
end
def rollback_stack!(stack)
puts_and_flush "\nStart rollback of a stack"
begin
stack.delete_stack_in_cloud!
Devops::Db.connector.stack_servers_delete(stack.name)
Devops::Db.connector.stack_delete(stack.id)
puts_and_flush "Stack rollback has been completed"
rescue StandardError, Sinatra::NotFound # Sinatra::NotFound often raised in tests
puts_and_flush "Stack rollback failed"
end
end
def save_report(stack_attrs)
update_report(
"created_by" => stack_attrs['owner'],
"project" => stack_attrs["project"],
"deploy_env" => stack_attrs["deploy_env"],
"type" => ::Devops::Model::Report::STACK_TYPE,
"subreports" => [],
"stack" => stack_attrs['name']
)
end
end