require "db/mongo/models/stack/stack_factory" require "db/mongo/models/project" require "workers/stack_bootstrap/stack_synchronizer" 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 !sync_stack 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 sync_stack sync_result = StackSynchronizer.new(@stack, out).sync if sync_result.ok? puts_and_flush "\nStack '#{@stack.name}' has been created" true else puts_and_flush "An error ocurred during stack synchronization: #{sync_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