2015-07-20 18:59:26 +03:00
|
|
|
require "db/mongo/models/stack/stack_factory"
|
2015-07-30 02:14:45 +03:00
|
|
|
require "db/mongo/models/project"
|
2016-03-29 20:09:05 +03:00
|
|
|
require "workers/stack_bootstrap/stack_creation_waiter"
|
2016-03-27 23:37:57 +03:00
|
|
|
require "workers/stack_bootstrap/servers_bootstrapper"
|
2016-01-31 17:52:11 +03:00
|
|
|
require "workers/stack_bootstrap/stack_servers_persister"
|
2015-09-21 15:54:33 +03:00
|
|
|
|
2015-07-30 13:18:55 +03:00
|
|
|
class StackBootstrapWorker < Worker
|
2015-07-20 18:59:26 +03:00
|
|
|
|
2016-02-10 20:39:49 +03:00
|
|
|
# options must contain 'stack_attributes'
|
2015-07-23 12:54:36 +03:00
|
|
|
def perform(options)
|
2016-02-10 20:39:49 +03:00
|
|
|
call do
|
|
|
|
|
stack_attrs = options.fetch('stack_attributes')
|
2015-08-14 17:48:07 +03:00
|
|
|
|
2015-09-01 16:31:31 +03:00
|
|
|
without_bootstrap = stack_attrs.delete('without_bootstrap')
|
2015-09-24 15:06:02 +03:00
|
|
|
@out.puts "Received 'without_bootstrap' option" if without_bootstrap
|
|
|
|
|
|
2016-02-10 20:39:49 +03:00
|
|
|
save_report(stack_attrs)
|
2015-09-01 16:31:31 +03:00
|
|
|
|
2016-03-25 14:50:22 +03:00
|
|
|
@stack = create_stack(stack_attrs)
|
2016-03-29 20:09:05 +03:00
|
|
|
if !wait_till_stack_is_created
|
2016-01-31 17:52:11 +03:00
|
|
|
puts_and_flush "Stack creating error"
|
2016-03-25 14:50:22 +03:00
|
|
|
return 1
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
begin
|
2016-03-27 23:37:57 +03:00
|
|
|
@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
|
2016-03-25 14:50:22 +03:00
|
|
|
rescue StandardError => e
|
|
|
|
|
puts_and_flush "\nAn error occured."
|
|
|
|
|
rollback_stack!(@stack)
|
|
|
|
|
raise e
|
2015-08-12 12:24:48 +03:00
|
|
|
end
|
2015-07-20 18:59:26 +03:00
|
|
|
end
|
|
|
|
|
end
|
2015-07-30 02:14:45 +03:00
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
2016-03-27 23:37:57 +03:00
|
|
|
def persist_stack_servers
|
|
|
|
|
StackServersPersister.new(@stack, out).persist
|
2016-01-31 17:52:11 +03:00
|
|
|
end
|
|
|
|
|
|
2016-03-27 23:37:57 +03:00
|
|
|
def bootstrap_servers_by_priority
|
|
|
|
|
PrioritizedGroupsBootstrapper.new(out, jid, @servers_by_priorities).bootstrap_servers_by_priority
|
2015-09-21 15:54:33 +03:00
|
|
|
end
|
|
|
|
|
|
2016-01-31 17:52:11 +03:00
|
|
|
# builds and persist stack model, initiate stack creating in cloud
|
2015-11-03 12:05:07 +03:00
|
|
|
def create_stack(stack_attrs)
|
|
|
|
|
stack = Devops::Model::StackFactory.create(stack_attrs["provider"], stack_attrs, @out)
|
2015-09-21 15:54:33 +03:00
|
|
|
mongo.stack_insert(stack)
|
2016-03-25 14:50:22 +03:00
|
|
|
end
|
|
|
|
|
|
2016-03-29 20:09:05 +03:00
|
|
|
def wait_till_stack_is_created
|
|
|
|
|
wait_result = StackCreationWaiter.new(@stack, out).sync
|
2015-09-21 15:54:33 +03:00
|
|
|
|
2016-03-29 20:09:05 +03:00
|
|
|
if wait_result.ok?
|
2016-03-25 14:50:22 +03:00
|
|
|
puts_and_flush "\nStack '#{@stack.name}' has been created"
|
|
|
|
|
true
|
2015-09-21 15:54:33 +03:00
|
|
|
else
|
2016-03-29 20:09:05 +03:00
|
|
|
puts_and_flush "An error ocurred during stack creation: #{wait_result.reason}"
|
2016-03-25 14:50:22 +03:00
|
|
|
false
|
2015-09-21 15:54:33 +03:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2016-01-31 17:52:11 +03:00
|
|
|
def rollback_stack!(stack)
|
|
|
|
|
puts_and_flush "\nStart rollback of a stack"
|
2016-03-27 23:37:57 +03:00
|
|
|
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
|
2015-09-01 16:31:31 +03:00
|
|
|
end
|
|
|
|
|
|
2016-02-10 20:39:49 +03:00
|
|
|
def save_report(stack_attrs)
|
|
|
|
|
update_report(
|
2015-09-01 16:31:31 +03:00
|
|
|
"created_by" => stack_attrs['owner'],
|
|
|
|
|
"project" => stack_attrs["project"],
|
|
|
|
|
"deploy_env" => stack_attrs["deploy_env"],
|
2015-11-05 16:47:12 +03:00
|
|
|
"type" => ::Devops::Model::Report::STACK_TYPE,
|
|
|
|
|
"subreports" => [],
|
|
|
|
|
"stack" => stack_attrs['name']
|
2015-09-01 16:31:31 +03:00
|
|
|
)
|
|
|
|
|
end
|
2015-07-20 18:59:26 +03:00
|
|
|
end
|