113 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "db/mongo/models/stack/stack_factory"
 | |
| require "lib/puts_and_flush"
 | |
| module Devops; module Executor; class StackExecutor; end; end; end # predeclare for visibility
 | |
| require_relative "stack_executor/stack_creation_waiter"
 | |
| require_relative "stack_executor/stack_servers_persister"
 | |
| require_relative "stack_executor/prioritized_groups_bootstrapper"
 | |
| require_relative "stack_executor/stack_servers_fetcher"
 | |
| 
 | |
| module Devops
 | |
|   module Executor
 | |
|     class StackExecutor
 | |
|       include PutsAndFlush
 | |
|       attr_reader :out, :stack
 | |
| 
 | |
|       def initialize(options)
 | |
|         @out = options.fetch(:out)
 | |
|         @stack = options[:stack]
 | |
|         self.just_persisted_by_priority = {}
 | |
|       end
 | |
| 
 | |
|       def create_stack(stack_attrs)
 | |
|         stack_attrs.merge!('persisting_is_locked' => true)
 | |
|         @stack = Devops::Model::StackFactory.create(stack_attrs["provider"], stack_attrs, out)
 | |
|         mongo.stack_insert(@stack)
 | |
|       end
 | |
| 
 | |
|       def wait_till_stack_is_created
 | |
|         wait_result = waiter.wait
 | |
|         stack.unlock_persisting!
 | |
|         wait_result.ok?
 | |
|       end
 | |
| 
 | |
|       def persist_new_servers
 | |
|         reload_stack
 | |
|         raise 'It seems that stack is synchronizing at the moment' if stack.persisting_is_locked
 | |
|         begin
 | |
|           stack.lock_persisting!
 | |
|           fetcher.new_servers_by_priorities.each do |priority, provider_infos|
 | |
|             servers = provider_infos.map {|info| persister.persist(info) }
 | |
|             just_persisted_by_priority[priority] = servers
 | |
|           end
 | |
| 
 | |
|           just_persisted_by_priority.values.flatten.each do |server|
 | |
|             puts_and_flush "\n\nPersisted server #{server.id}: #{JSON.pretty_generate(server.to_hash)}"
 | |
|           end
 | |
|         ensure
 | |
|           stack.unlock_persisting!
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def bootstrap_just_persisted(jid)
 | |
|         puts_and_flush "Bootstrapping just persisted servers" if just_persisted_by_priority.values.flatten.any?
 | |
|         just_persisted_by_priority.each do |priority, servers|
 | |
|           puts_and_flush "Servers with priority '#{priority}': #{servers.map(&:id).join(", ")}"
 | |
|         end
 | |
|         PrioritizedGroupsBootstrapper.new(out, jid, just_persisted_by_priority).bootstrap_servers_by_priority
 | |
|       end
 | |
| 
 | |
|       def delete_stale_servers
 | |
|         fetcher.stale_servers.each do |server|
 | |
|           proper_remove_server(server)
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def delete_stack
 | |
|         out.puts "Removing stack from cloud"
 | |
|         stack.delete_stack_in_cloud!
 | |
|         out.puts "Removing stack servers"
 | |
|         mongo.stack_servers(@stack.name).each do |server|
 | |
|           proper_remove_server(server)
 | |
|         end
 | |
|         out.puts "Removing stack from db"
 | |
|         mongo.stack_delete(stack.id)
 | |
|         out.flush
 | |
|       end
 | |
| 
 | |
|       private
 | |
| 
 | |
|       attr_accessor :just_persisted_by_priority
 | |
| 
 | |
|       def mongo
 | |
|         Devops::Db.connector
 | |
|       end
 | |
| 
 | |
|       def proper_remove_server(server)
 | |
|         begin
 | |
|           e = Devops::Executor::ServerExecutor.new(server, out)
 | |
|           e.delete_server
 | |
|         rescue StandardError => e
 | |
|           puts_and_flush [e.message, e.backtrace].join("\n")
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def reload_stack
 | |
|         @stack = mongo.stack(@stack.name)
 | |
|       end
 | |
| 
 | |
|       def fetcher
 | |
|         @fetcher ||= StackServersFetcher.new(stack, out)
 | |
|       end
 | |
| 
 | |
|       def persister
 | |
|         @persister ||= StackServersPersister.new(@stack)
 | |
|       end
 | |
| 
 | |
|       def waiter
 | |
|         StackCreationWaiter.new(stack, out)
 | |
|       end
 | |
| 
 | |
|     end
 | |
|   end
 | |
| end
 | 
