78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require 'workers/bootstrap_worker'
 | |
| require "workers/stack_bootstrap/errors"
 | |
| 
 | |
| class StackServersBootstrapper
 | |
|   include PutsAndFlush
 | |
|   attr_reader :out
 | |
| 
 | |
|   def initialize(out, jid)
 | |
|     @out, @jid = out, jid
 | |
|   end
 | |
| 
 | |
|   def bootstrap(servers)
 | |
|     @servers = servers
 | |
|     puts_and_flush "\nStart bootstraping stack servers"
 | |
| 
 | |
|     servers_jobs_ids = start_workers
 | |
|     ::Devops::Db.connector.add_report_subreports(@jid, servers_jobs_ids.values)
 | |
| 
 | |
|     out.puts
 | |
|     servers_jobs_ids.each do |server_id, subreport_id|
 | |
|       job_result_code = wait_for_job(server_id, subreport_id)
 | |
|       check_job_result!(server_id, job_result_code)
 | |
|     end
 | |
|     puts_and_flush "Stack servers have been bootstraped"
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def check_job_result!(server_id, job_result_code)
 | |
|     return if job_result_code == 0
 | |
| 
 | |
|     reason = Devops::Executor::ServerExecutor.reason_from_error_code(job_result_code)
 | |
|     puts_and_flush "Operation result for #{server_id}: #{reason}"
 | |
| 
 | |
|     if error_occured_during_bootstrap?(reason)
 | |
|       raise StackServerBootstrapError # will cause rollback of a stack
 | |
|     else
 | |
|       raise StackServerDeployError #will not cause rollback of a stack
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def error_occured_during_bootstrap?(reason)
 | |
|     Devops::Executor::ServerExecutor.bootstrap_errors_reasons.include?(reason)
 | |
|   end
 | |
| 
 | |
|   def wait_for_job(server_id, subreport_id)
 | |
|     1000.times do
 | |
|       sleep(5)
 | |
|       subreport = ::Devops::Db.connector.report(subreport_id)
 | |
|       case subreport.status
 | |
|       when Worker::STATUS::COMPLETED
 | |
|         puts_and_flush "Server '#{server_id}' has been bootstraped with job #{subreport_id}"
 | |
|         return 0
 | |
|       when Worker::STATUS::FAILED
 | |
|         puts_and_flush "Server '#{server_id}' hasn't been bootstraped with job #{subreport_id}. Job result code is '#{subreport.job_result_code}'"
 | |
|         return subreport.job_result_code
 | |
|       end
 | |
|     end
 | |
|     puts_and_flush "Waiting for job #{subreport_id} halted: timeout reached."
 | |
|     raise StackServerBootstrapDeployTimeout
 | |
|   end
 | |
| 
 | |
|   # returns hash: {server_id => worker_job_id}
 | |
|   def start_workers
 | |
|     servers_jobs_ids = {}
 | |
|     @servers.each do |server|
 | |
|       job_id = Worker.start_async(::BootstrapWorker,
 | |
|         server_attrs: server.to_mongo_hash,
 | |
|         bootstrap_template: 'omnibus',
 | |
|         owner: server.created_by
 | |
|       )
 | |
|       @out.puts "Bootstraping server '#{server.id}'... job id: #{job_id}"
 | |
|       servers_jobs_ids[server.id] = job_id
 | |
|     end
 | |
|     puts_and_flush "\n"
 | |
|     servers_jobs_ids
 | |
|   end
 | |
| end | 
