| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  | require 'lib/helpers/job_waiter' | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  | require 'workers/bootstrap_worker' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Starts bootstrap workers for each server in group and wait for them to end (synchroniously). | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  | class Devops::Executor::StackExecutor | 
					
						
							|  |  |  |   class ServersBootstrapper | 
					
						
							|  |  |  |     include PutsAndFlush | 
					
						
							|  |  |  |     attr_reader :out | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |     class Result < Devops::Helpers::ResultObject | 
					
						
							|  |  |  |       set_result_codes( | 
					
						
							|  |  |  |         ok: 0, | 
					
						
							|  |  |  |         bootstrap_error: 2, | 
					
						
							|  |  |  |         deploy_error: 3, | 
					
						
							|  |  |  |         timeout_reached: 4
 | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |     def initialize(out, jid, servers) | 
					
						
							|  |  |  |       @out, @jid, @servers = out, jid, servers | 
					
						
							|  |  |  |       @server_bootstrap_jobs = {} | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |     # returns array of Results | 
					
						
							|  |  |  |     def bootstrap_group | 
					
						
							|  |  |  |       start_workers! | 
					
						
							|  |  |  |       ::Devops::Db.connector.add_report_subreports(@jid, @server_bootstrap_jobs.values) | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |       @server_bootstrap_jobs.map do |server_id, job_id| | 
					
						
							|  |  |  |         result = wait_for_bootstrap_job(job_id) | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |         puts_and_flush Devops::Messages.t("stack_executor.servers_bootstrapper.result.#{result.reason}", server_id: server_id, job_id: job_id) | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |         result | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |     private | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |     # returns hash: {server_id => worker_job_id} | 
					
						
							|  |  |  |     def start_workers! | 
					
						
							|  |  |  |       @servers.each do |server| | 
					
						
							|  |  |  |         job_id = Worker.start_async(::BootstrapWorker, | 
					
						
							|  |  |  |           server_attrs: server.to_mongo_hash, | 
					
						
							|  |  |  |           bootstrap_template: 'omnibus', | 
					
						
							| 
									
										
										
										
											2016-04-04 13:17:07 +03:00
										 |  |  |           owner: server.created_by, | 
					
						
							|  |  |  |           skip_rollback: true | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |         ) | 
					
						
							|  |  |  |         @out.puts "Start bootstraping server '#{server.id}' job (job id: #{job_id})." | 
					
						
							|  |  |  |         @server_bootstrap_jobs[server.id] = job_id | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       puts_and_flush "\n\n\n" | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |     def result(reason) | 
					
						
							|  |  |  |       Result.from_reason(reason) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |     def wait_for_bootstrap_job(job_id) | 
					
						
							|  |  |  |       result_code = Devops::Helpers::JobWaiter.new(job_id).wait | 
					
						
							|  |  |  |       result_from_job_code(result_code) | 
					
						
							|  |  |  |     rescue Devops::Helpers::JobWaiter::TimeoutReached | 
					
						
							|  |  |  |       result(:timeout_reached) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-30 12:57:24 +03:00
										 |  |  |     def result_from_job_code(result_code) | 
					
						
							|  |  |  |       job_result = Devops::Executor::ServerOperationResult.new(result_code) | 
					
						
							|  |  |  |       if job_result.ok? | 
					
						
							|  |  |  |         result(:ok) | 
					
						
							|  |  |  |       elsif job_result.one_of_bootstrap_errors? | 
					
						
							|  |  |  |         result(:bootstrap_error) | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         result(:deploy_error) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-03-27 23:37:57 +03:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |