Add a check for VM accessibility before every action
This commit is contained in:
parent
2efe1f9135
commit
327a6f9d94
|
@ -101,6 +101,7 @@ module Vagrant
|
||||||
# now, these are limited to what are needed internally.
|
# now, these are limited to what are needed internally.
|
||||||
register(:before_action_run, Builder.new do
|
register(:before_action_run, Builder.new do
|
||||||
use General::Validate
|
use General::Validate
|
||||||
|
use VM::CheckAccessible
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,6 +2,7 @@ module Vagrant
|
||||||
class Action
|
class Action
|
||||||
module VM
|
module VM
|
||||||
autoload :Boot, 'vagrant/action/vm/boot'
|
autoload :Boot, 'vagrant/action/vm/boot'
|
||||||
|
autoload :CheckAccessible, 'vagrant/action/vm/check_accessible'
|
||||||
autoload :CheckBox, 'vagrant/action/vm/check_box'
|
autoload :CheckBox, 'vagrant/action/vm/check_box'
|
||||||
autoload :CheckGuestAdditions, 'vagrant/action/vm/check_guest_additions'
|
autoload :CheckGuestAdditions, 'vagrant/action/vm/check_guest_additions'
|
||||||
autoload :CleanMachineFolder, 'vagrant/action/vm/clean_machine_folder'
|
autoload :CleanMachineFolder, 'vagrant/action/vm/clean_machine_folder'
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
module Vagrant
|
||||||
|
class Action
|
||||||
|
module VM
|
||||||
|
class CheckAccessible
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
if env["vm"] && env["vm"].created? && !env["vm"].vm.accessible?
|
||||||
|
# The VM we are attempting to manipulate is inaccessible. This
|
||||||
|
# is a very bad situation and can only be fixed by the user. It
|
||||||
|
# also prohibits us from actually doing anything with the virtual
|
||||||
|
# machine, so we raise an error.
|
||||||
|
raise Errors::VMInaccessible
|
||||||
|
end
|
||||||
|
|
||||||
|
@app.call(env)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -319,6 +319,11 @@ module Vagrant
|
||||||
error_key(:failure, "vagrant.actions.vm.import")
|
error_key(:failure, "vagrant.actions.vm.import")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class VMInaccessible < VagrantError
|
||||||
|
status_code(54)
|
||||||
|
error_key(:vm_inaccessible)
|
||||||
|
end
|
||||||
|
|
||||||
class VMNotCreatedError < VagrantError
|
class VMNotCreatedError < VagrantError
|
||||||
status_code(6)
|
status_code(6)
|
||||||
error_key(:vm_creation_required)
|
error_key(:vm_creation_required)
|
||||||
|
|
|
@ -144,6 +144,11 @@ en:
|
||||||
http://vagrantup.com/docs/getting-started/setup/windows_x64.html
|
http://vagrantup.com/docs/getting-started/setup/windows_x64.html
|
||||||
|
|
||||||
vm_creation_required: "VM must be created before running this command. Run `vagrant up` first."
|
vm_creation_required: "VM must be created before running this command. Run `vagrant up` first."
|
||||||
|
vm_inaccessible: |-
|
||||||
|
Your VM has become "inaccessible." Unfortunately, this is a critical error
|
||||||
|
with VirtualBox that Vagrant can not cleanly recover from. Please open VirtualBox
|
||||||
|
and clear out your inaccessible virtual machines or find a way to fix
|
||||||
|
them.
|
||||||
vm_not_found: "A VM by the name of %{name} was not found."
|
vm_not_found: "A VM by the name of %{name} was not found."
|
||||||
vm_not_running: "VM must be running to open SSH connection."
|
vm_not_running: "VM must be running to open SSH connection."
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class CheckAccessibleVMActionTest < Test::Unit::TestCase
|
||||||
|
setup do
|
||||||
|
@klass = Vagrant::Action::VM::CheckAccessible
|
||||||
|
end
|
||||||
|
|
||||||
|
context "calling" do
|
||||||
|
setup do
|
||||||
|
@app, @env = action_env
|
||||||
|
@instance = @klass.new(@app, @env)
|
||||||
|
end
|
||||||
|
|
||||||
|
should "continue up the chain if the VM is nil" do
|
||||||
|
@env["vm"] = nil
|
||||||
|
|
||||||
|
@app.expects(:call).once
|
||||||
|
|
||||||
|
assert_nothing_raised {
|
||||||
|
@instance.call(@env)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
should "continue up the chain if the VM is not created" do
|
||||||
|
@env["vm"] = mock("vm")
|
||||||
|
@env["vm"].stubs(:created?).returns(false)
|
||||||
|
|
||||||
|
@app.expects(:call).once
|
||||||
|
|
||||||
|
assert_nothing_raised {
|
||||||
|
@instance.call(@env)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
should "continue up the chain if the VM is created and accessible" do
|
||||||
|
@env["vm"] = mock("vm")
|
||||||
|
@env["vm"].stubs(:created?).returns(true)
|
||||||
|
@env["vm"].stubs(:vm).returns(mock("real_vm"))
|
||||||
|
@env["vm"].vm.stubs(:accessible?).returns(true)
|
||||||
|
|
||||||
|
@app.expects(:call).once
|
||||||
|
|
||||||
|
assert_nothing_raised {
|
||||||
|
@instance.call(@env)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
should "fail if the VM is not accessible" do
|
||||||
|
@env["vm"] = mock("vm")
|
||||||
|
@env["vm"].stubs(:created?).returns(true)
|
||||||
|
@env["vm"].stubs(:vm).returns(mock("real_vm"))
|
||||||
|
@env["vm"].vm.stubs(:accessible?).returns(false)
|
||||||
|
|
||||||
|
@app.expects(:call).never
|
||||||
|
|
||||||
|
assert_raises(Vagrant::Errors::VMInaccessible) {
|
||||||
|
@instance.call(@env)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue