| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  | require 'lib/executors/stack_executor' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class StackSyncWorker < Worker | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |   MAX_LOCK_WAITING_TIME = 15000
 | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # @options: | 
					
						
							|  |  |  |   #   'stack_name'    required | 
					
						
							|  |  |  |   #   'created_by'  optional | 
					
						
							|  |  |  |   def perform(options) | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |     call do |out, task| | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |       stack_name = options.fetch('stack_name') | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |       @created_by = options['created_by'] || ::Devops::Model::JobTask::SYSTEM_OWNER | 
					
						
							|  |  |  |       #TODO: mongoid query | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |       @stack = mongo.stack(stack_name) | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       set_task_data({ | 
					
						
							|  |  |  |         "created_by" => @created_by, | 
					
						
							|  |  |  |         "project" => @stack.project, | 
					
						
							|  |  |  |         "environment" => @stack.environment, | 
					
						
							|  |  |  |         "category" => @stack.category, | 
					
						
							|  |  |  |         "type" => Devops::Model::JobTask::SYNC_STACK_TYPE, | 
					
						
							|  |  |  |         "subtasks" => [], | 
					
						
							|  |  |  |         "stack" => @stack.name | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-15 15:51:52 +03:00
										 |  |  |       wait_until_stack_is_unlocked | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |       puts_and_flush 'Persisting new servers.' | 
					
						
							|  |  |  |       executor.persist_new_servers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       puts_and_flush "\n\nDeleting stale servers." | 
					
						
							|  |  |  |       executor.delete_stale_servers | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |       puts_and_flush "\n\nBootstrapping just persisted servers." | 
					
						
							|  |  |  |       bootstrap_result = executor.bootstrap_just_persisted(jid) | 
					
						
							|  |  |  |       puts_and_flush Devops::Messages.t("worker.stack_sync.bootstrap_result.#{bootstrap_result.reason}") | 
					
						
							|  |  |  |       bootstrap_result.code | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def executor | 
					
						
							| 
									
										
										
										
											2018-04-04 22:44:39 +03:00
										 |  |  |     @executor ||= Devops::Executor::StackExecutor.new(out: out, stack: @stack, current_user: @created_by) | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def wait_until_stack_is_unlocked | 
					
						
							|  |  |  |     return unless @stack.persisting_is_locked | 
					
						
							|  |  |  |     puts_and_flush 'Stack is locked, waiting...' | 
					
						
							|  |  |  |     waiting_time = 0
 | 
					
						
							|  |  |  |     sleep_time = 10
 | 
					
						
							|  |  |  |     loop do | 
					
						
							|  |  |  |       sleep(sleep_time) | 
					
						
							|  |  |  |       @stack = mongo.stack(@stack.name) | 
					
						
							|  |  |  |       return unless @stack.persisting_is_locked | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       waiting_time += sleep_time | 
					
						
							|  |  |  |       raise "Stack has been locked for too long" if waiting_time > MAX_LOCK_WAITING_TIME | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | end |