require 'workers/stack_bootstrap_worker' RSpec.describe StackServersBootstrapper, stubbed_connector: true do let(:out) { double(:out, puts: nil, flush: nil) } let(:jid) { 1000 } let(:bootstrapper) { described_class.new(out, jid) } let(:servers) { [build(:server, id: 'a'), build(:server, id: 'b')] } let(:bootstrap_job_ids) { %w(100 200) } let(:subreport1) { build(:report, id: bootstrap_job_ids.first) } let(:subreport2) { build(:report, id: bootstrap_job_ids.last) } describe '#bootstrap' do let(:bootstrap!) { bootstrapper.bootstrap(servers) } before do allow(Worker).to receive(:start_async).and_return(*bootstrap_job_ids) allow(stubbed_connector).to receive(:add_report_subreports) allow(stubbed_connector).to receive(:report) do |subreport_id| subreport_id == '100' ? subreport1 : subreport2 end allow(bootstrapper).to receive(:sleep) end it 'start bootstrap workers' do expect(Worker).to receive(:start_async).with(BootstrapWorker, hash_including(:server_attrs, :bootstrap_template, :owner)) bootstrap! end it 'add subreports' do expect(stubbed_connector).to receive(:add_report_subreports).with(jid, bootstrap_job_ids) bootstrap! end it 'waits for job to end' do allow(subreport1).to receive(:status).and_return('running', 'running', 'running', 'completed') allow(subreport2).to receive(:status).and_return('running', 'running', 'running', 'completed') expect(bootstrapper).to receive(:sleep).exactly(2*4).times bootstrap! end it 'raises StackServerBootstrapError if an error occured during bootstrap' do allow(subreport1).to receive(:status) {'failed'} allow(subreport1).to receive(:job_result_code) { Devops::Executor::ServerExecutor.error_code(:server_bootstrap_fail) } expect { bootstrap! }.to raise_error StackServerBootstrapError end it 'raises StackServerDeployError if an error occured during deploy' do allow(subreport1).to receive(:status) {'failed'} allow(subreport1).to receive(:job_result_code) { Devops::Executor::ServerExecutor.error_code(:deploy_failed) } expect { bootstrap! }.to raise_error StackServerDeployError end it "raises StackServerBootstrapDeployTimeout if bootstrap and deploy hasn't been finished in 5000 seconds" do allow(subreport1).to receive(:status) {'running'} expect { bootstrap! }.to raise_error StackServerBootstrapDeployTimeout end end end