Skip to content

Commit

Permalink
Merge pull request #13496 from allisonlarson/allison-virtualbox-state…
Browse files Browse the repository at this point in the history
…-update

Update provider/virtualbox to allow paused state when booting vm
  • Loading branch information
allisonlarson authored Sep 23, 2024
2 parents ae6a175 + 1347f70 commit f977161
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 1 deletion.
2 changes: 1 addition & 1 deletion plugins/providers/virtualbox/action.rb
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def self.action_boot
b.use Customize, "pre-boot"
b.use Boot
b.use Customize, "post-boot"
b.use WaitForCommunicator, [:starting, :running]
b.use WaitForCommunicator, [:starting, :running, :paused]
b.use Call, IsEnvSet, :cloud_init do |env, b2|
if env[:result]
b2.use CloudInitWait
Expand Down
58 changes: 58 additions & 0 deletions test/unit/vagrant/action/builtin/wait_for_communicator_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
require File.expand_path("../../../../base", __FILE__)

describe Vagrant::Action::Builtin::WaitForCommunicator do
let(:app) { lambda { |env| } }
let(:ui) { lambda { |env| } }
let(:env) { { machine: machine, ui: ui } }

let(:vm) do
double("vm",
communicator: nil
)
end

# Configuration mock
let(:config) { double("config", vm: vm) }

# Communicate mock
let(:communicate) { double("communicate") }

let(:state) { double("state") }

let(:ui) { Vagrant::UI::Silent.new }

let(:machine) do
double("machine",
config: config,
communicate: communicate,
state: state,)
end

before do
allow(vm).to receive(:boot_timeout).and_return(1)
allow(communicate).to receive(:wait_for_ready).with(1).and_return(true)
end

it "raise an error if a bad state is encountered" do
allow(state).to receive(:id).and_return(:stopped)

expect { described_class.new(app, env, [:running]).call(env) }.
to raise_error(Vagrant::Errors::VMBootBadState)
end

it "raise an error if the vm doesn't boot" do
allow(communicate).to receive(:wait_for_ready).and_return(false)
allow(state).to receive(:id).and_return(:running)

expect { described_class.new(app, env, [:running]).call(env) }.
to raise_error(Vagrant::Errors::VMBootTimeout)
end

it "succeed when a valid state is encountered" do
allow(communicate).to receive(:wait_for_ready).and_return(true)
allow(state).to receive(:id).and_return(:running)

expect { described_class.new(app, env, [:running]).call(env) }.
to_not raise_error
end
end

0 comments on commit f977161

Please sign in to comment.