mirror of
https://github.com/vagrant-libvirt/vagrant-libvirt.git
synced 2025-02-25 18:55:27 -06:00
Various checks in the start domain action were accidentally causing a redefine right after initial create. Update to provide debug output when the domain needs to be changed to allow capture of the redefines occurring in the future and to make it easy for the tests to pick up where the redefine was triggered by setting an expectation on the log output. Include a small fix to avoid running strip on what might be a nil object returned for elements without any text attributes. Fix a bug where changes to tpm settings made to the config after an initial domain creation where there was previously no tpm defined, would be ignored. Adds a logger double and updates other tests that trigger log calls. should fix #1176
132 lines
5.0 KiB
Ruby
132 lines
5.0 KiB
Ruby
require 'vagrant-libvirt/action/wait_till_up'
|
|
require 'vagrant-libvirt/errors'
|
|
|
|
require 'spec_helper'
|
|
require 'support/sharedcontext'
|
|
require 'support/libvirt_context'
|
|
|
|
describe VagrantPlugins::ProviderLibvirt::Action::WaitTillUp do
|
|
subject { described_class.new(app, env) }
|
|
|
|
include_context 'vagrant-unit'
|
|
include_context 'libvirt'
|
|
include_context 'unit'
|
|
|
|
describe '#call' do
|
|
before do
|
|
allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver)
|
|
.to receive(:get_domain).and_return(domain)
|
|
allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver).to receive(:state)
|
|
.and_return(:running)
|
|
end
|
|
|
|
context 'when machine does not exist' do
|
|
before do
|
|
allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver)
|
|
.to receive(:get_domain).and_return(nil)
|
|
end
|
|
|
|
it 'raises exception' do
|
|
expect(app).to_not receive(:call)
|
|
expect { subject.call(env) }.to raise_error(::VagrantPlugins::ProviderLibvirt::Errors::NoDomainError,
|
|
/No domain found. Domain dummy-vagrant_dummy not found/)
|
|
end
|
|
end
|
|
|
|
context 'when machine is booting' do
|
|
context 'if interrupted looking for IP' do
|
|
before do
|
|
env[:interrupted] = true
|
|
end
|
|
it 'should exit' do
|
|
expect(app).to_not receive(:call)
|
|
expect(ui).to receive(:info).with('Waiting for domain to get an IP address...')
|
|
expect(logger).to receive(:debug).with(/Searching for IP for MAC address: .*/)
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'if interrupted waiting for SSH' do
|
|
before do
|
|
allow(domain).to receive(:wait_for).and_return(true)
|
|
allow(env).to receive(:[]).and_call_original
|
|
allow(env).to receive(:[]).with(:interrupted).and_return(false, true, true)
|
|
allow(env).to receive(:[]).with(:ip_address).and_return('192.168.121.2')
|
|
end
|
|
it 'should exit after getting IP' do
|
|
expect(app).to_not receive(:call)
|
|
expect(ui).to receive(:info).with('Waiting for domain to get an IP address...')
|
|
expect(ui).to receive(:info).with('Waiting for SSH to become available...')
|
|
expect(logger).to receive(:debug).with(/Searching for IP for MAC address: .*/)
|
|
expect(logger).to receive(:info).with('Got IP address 192.168.121.2')
|
|
expect(logger).to receive(:info).with(/Time for getting IP: .*/)
|
|
expect(env[:machine].communicate).to_not receive(:ready?)
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when machine boots and ssh available' do
|
|
before do
|
|
allow(domain).to receive(:wait_for).and_return(true)
|
|
allow(env).to receive(:[]).and_call_original
|
|
allow(env).to receive(:[]).with(:interrupted).and_return(false)
|
|
allow(env).to receive(:[]).with(:ip_address).and_return('192.168.121.2')
|
|
end
|
|
it 'should call the next hook' do
|
|
expect(app).to receive(:call)
|
|
expect(ui).to receive(:info).with('Waiting for domain to get an IP address...')
|
|
expect(ui).to receive(:info).with('Waiting for SSH to become available...')
|
|
expect(logger).to receive(:debug).with(/Searching for IP for MAC address: .*/)
|
|
expect(logger).to receive(:info).with('Got IP address 192.168.121.2')
|
|
expect(logger).to receive(:info).with(/Time for getting IP: .*/)
|
|
expect(logger).to receive(:info).with(/Time for SSH ready: .*/)
|
|
expect(env[:machine].communicate).to receive(:ready?).and_return(true)
|
|
expect(subject.call(env)).to be_nil
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#recover' do
|
|
before do
|
|
allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver).to receive(:get_domain).and_return(machine)
|
|
allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver).to receive(:state)
|
|
.and_return(:not_created)
|
|
allow(env).to receive(:[]).and_call_original
|
|
end
|
|
|
|
it 'should do nothing by default' do
|
|
expect(env).to_not receive(:[]).with(:action_runner) # cleanup
|
|
expect(subject.recover(env)).to be_nil
|
|
end
|
|
|
|
context 'with machine coming up' do
|
|
before do
|
|
allow_any_instance_of(VagrantPlugins::ProviderLibvirt::Driver).to receive(:state)
|
|
.and_return(:running)
|
|
env[:destroy_on_error] = true
|
|
end
|
|
|
|
context 'and user has disabled destroy on failure' do
|
|
before do
|
|
env[:destroy_on_error] = false
|
|
end
|
|
|
|
it 'skips terminate on failure' do
|
|
expect(env).to_not receive(:[]).with(:action_runner) # cleanup
|
|
expect(subject.recover(env)).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'and using default settings' do
|
|
let(:runner) { double('runner') }
|
|
it 'deletes VM on failure' do
|
|
expect(env).to receive(:[]).with(:action_runner).and_return(runner) # cleanup
|
|
expect(runner).to receive(:run)
|
|
expect(subject.recover(env)).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|