| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  | require "db/mongo/models/stack/stack_factory" | 
					
						
							|  |  |  | require "lib/puts_and_flush" | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  | module Devops; module Executor; class StackExecutor; end; end; end # predeclare for visibility | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  | require_relative "stack_executor/stack_creation_waiter" | 
					
						
							|  |  |  | require_relative "stack_executor/stack_servers_persister" | 
					
						
							|  |  |  | require_relative "stack_executor/prioritized_groups_bootstrapper" | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  | require_relative "stack_executor/stack_servers_fetcher" | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | module Devops | 
					
						
							|  |  |  |   module Executor | 
					
						
							|  |  |  |     class StackExecutor | 
					
						
							|  |  |  |       include PutsAndFlush | 
					
						
							|  |  |  |       attr_reader :out, :stack | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def initialize(options) | 
					
						
							|  |  |  |         @out = options.fetch(:out) | 
					
						
							|  |  |  |         @stack = options[:stack] | 
					
						
							| 
									
										
										
										
											2016-04-15 15:51:52 +03:00
										 |  |  |         @just_persisted_by_priority = {} | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def create_stack(stack_attrs) | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |         stack_attrs.merge!('persisting_is_locked' => true) | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  |         @stack = Devops::Model::StackFactory.create(stack_attrs["provider"], stack_attrs, out) | 
					
						
							|  |  |  |         mongo.stack_insert(@stack) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |       def wait_till_stack_is_created | 
					
						
							| 
									
										
										
										
											2016-04-15 17:05:50 +03:00
										 |  |  |         waiter.wait.ok? | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def persist_new_servers | 
					
						
							| 
									
										
										
										
											2016-04-15 15:51:52 +03:00
										 |  |  |         fetcher.reset_states | 
					
						
							|  |  |  |         servers_to_persist = fetcher.servers_to_persist | 
					
						
							|  |  |  |         if servers_to_persist.any? | 
					
						
							|  |  |  |           out.puts 'Servers to persist:' | 
					
						
							|  |  |  |           servers_to_persist.each { |info| out.puts JSON.pretty_generate(info) } | 
					
						
							|  |  |  |           puts_and_flush "\n\nPersisting new servers:" | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           puts_and_flush 'There are no servers to persist.' | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         fetcher.new_servers_by_priorities.each do |priority, provider_infos| | 
					
						
							|  |  |  |           servers = provider_infos.map {|info| persister.persist(info) } | 
					
						
							| 
									
										
										
										
											2016-04-19 18:09:41 +03:00
										 |  |  |           servers.each { |server| out.puts JSON.pretty_generate(server.to_hash) } | 
					
						
							| 
									
										
										
										
											2016-04-15 15:51:52 +03:00
										 |  |  |           @just_persisted_by_priority[priority] = servers | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-04-15 15:51:52 +03:00
										 |  |  |         puts_and_flush "New servers have been persisted" | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def bootstrap_just_persisted(jid) | 
					
						
							| 
									
										
										
										
											2016-04-15 15:51:52 +03:00
										 |  |  |         puts_and_flush "Bootstrapping just persisted servers" if @just_persisted_by_priority.values.flatten.any? | 
					
						
							|  |  |  |         @just_persisted_by_priority.each do |priority, servers| | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |           puts_and_flush "Servers with priority '#{priority}': #{servers.map(&:id).join(", ")}" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-04-15 15:51:52 +03:00
										 |  |  |         PrioritizedGroupsBootstrapper.new(out, jid, @just_persisted_by_priority).bootstrap_servers_by_priority | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |       def delete_stale_servers | 
					
						
							| 
									
										
										
										
											2016-04-15 15:51:52 +03:00
										 |  |  |         fetcher.reset_states | 
					
						
							|  |  |  |         servers_to_delete = fetcher.stale_servers | 
					
						
							|  |  |  |         if servers_to_delete.any? | 
					
						
							|  |  |  |           out.puts "\nStale servers:" | 
					
						
							|  |  |  |           servers_to_delete.each { |server| out.puts JSON.pretty_generate(server.to_hash) } | 
					
						
							|  |  |  |           puts_and_flush 'Deleting stale servers.' | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           puts_and_flush "\nThere are no stale servers." | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         servers_to_delete.each do |server| | 
					
						
							| 
									
										
										
										
											2016-04-13 16:09:25 +03:00
										 |  |  |           proper_remove_server(server) | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def delete_stack | 
					
						
							| 
									
										
										
										
											2016-04-13 23:18:17 +03:00
										 |  |  |         out.puts "Removing stack from cloud" | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  |         stack.delete_stack_in_cloud! | 
					
						
							| 
									
										
										
										
											2016-04-13 23:18:17 +03:00
										 |  |  |         out.puts "Removing stack servers" | 
					
						
							| 
									
										
										
										
											2016-04-13 16:09:25 +03:00
										 |  |  |         mongo.stack_servers(@stack.name).each do |server| | 
					
						
							|  |  |  |           proper_remove_server(server) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-04-13 23:18:17 +03:00
										 |  |  |         out.puts "Removing stack from db" | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  |         mongo.stack_delete(stack.id) | 
					
						
							| 
									
										
										
										
											2016-04-13 23:18:17 +03:00
										 |  |  |         out.flush | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def mongo | 
					
						
							|  |  |  |         Devops::Db.connector | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-13 16:09:25 +03:00
										 |  |  |       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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |       def fetcher | 
					
						
							|  |  |  |         @fetcher ||= StackServersFetcher.new(stack, out) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def persister | 
					
						
							|  |  |  |         @persister ||= StackServersPersister.new(@stack) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def waiter | 
					
						
							|  |  |  |         StackCreationWaiter.new(stack, out) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:05:59 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |