59 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require 'lib/helpers/job_waiter'
 | |
| require 'workers/bootstrap_worker'
 | |
| 
 | |
| # Starts bootstrap workers for each server in group and wait for them to end (synchroniously).
 | |
| class Devops::Executor::StackExecutor
 | |
|   class GroupBootstrapper
 | |
|     include PutsAndFlush
 | |
|     attr_reader :out
 | |
| 
 | |
|     class Result < Devops::Helpers::ResultObject
 | |
|       set_result_codes timeout_reached: 4
 | |
|       def one_of_bootstrap_errors?
 | |
|         false
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     def initialize(out, jid, servers)
 | |
|       @out, @jid, @servers = out, jid, servers
 | |
|       @server_bootstrap_jobs = {}
 | |
|     end
 | |
| 
 | |
|     # returns array of Results
 | |
|     def bootstrap_group
 | |
|       start_workers!
 | |
|       ::Devops::Db.connector.add_report_subreports(@jid, @server_bootstrap_jobs.values)
 | |
| 
 | |
|       @server_bootstrap_jobs.map do |server_id, job_id|
 | |
|         result = wait_for_bootstrap_job(job_id)
 | |
|         puts_and_flush Devops::Messages.t("stack_executor.group_bootstrapper.result.#{result.reason}", server_id: server_id, job_id: job_id)
 | |
|         result
 | |
|       end
 | |
|     end
 | |
| 
 | |
|     private
 | |
| 
 | |
|     # 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',
 | |
|           owner: server.created_by,
 | |
|           skip_rollback: true
 | |
|         )
 | |
|         @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"
 | |
|     end
 | |
| 
 | |
|     def wait_for_bootstrap_job(job_id)
 | |
|       result_code = Devops::Helpers::JobWaiter.new(job_id).wait
 | |
|       Devops::Executor::ServerOperationResult.new(result_code)
 | |
|     rescue Devops::Helpers::JobWaiter::TimeoutReached
 | |
|       Result.from_reason(:timeout_reached)
 | |
|     end
 | |
| 
 | |
|   end
 | |
| end | 
