Building up the `destroy` action again using new provider API.
This shows me moving the built-in middleware sequences to the provider and how I'm organizing all that.
This commit is contained in:
parent
5f8a654393
commit
5eed3b8417
|
@ -1,28 +0,0 @@
|
|||
module Vagrant
|
||||
module Action
|
||||
module General
|
||||
# Checks that virtualbox is installed and ready to be used.
|
||||
class CheckVirtualbox
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
# Certain actions may not actually have a VM, and thus no
|
||||
# driver, so we have to be clever about obtaining an instance
|
||||
# of the driver.
|
||||
driver = nil
|
||||
driver = env[:vm].driver if env[:vm]
|
||||
driver = Driver::VirtualBox.new(nil) if !driver
|
||||
|
||||
# Verify that it is ready to go! This will raise an exception
|
||||
# if anything goes wrong.
|
||||
driver.verify!
|
||||
|
||||
# Carry on.
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -9,7 +9,10 @@ module Vagrant
|
|||
end
|
||||
|
||||
def call(env)
|
||||
env[:vm].config.validate!(env[:vm].env) if !env.has_key?("validate") || env["validate"]
|
||||
if !env.has_key?(:validate) || env[:validate]
|
||||
env[:machine].config.validate!(env[:machine].env)
|
||||
end
|
||||
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -19,6 +19,9 @@ module VagrantPlugins
|
|||
|
||||
@logger.debug("'Destroy' each target VM...")
|
||||
with_target_vms(argv, :reverse => true) do |vm|
|
||||
vm.action(:destroy)
|
||||
next
|
||||
|
||||
if vm.created?
|
||||
# Boolean whether we should actually go through with the destroy
|
||||
# or not. This is true only if the "--force" flag is set or if the
|
||||
|
|
|
@ -0,0 +1,20 @@
|
|||
require "vagrant/action/builder"
|
||||
|
||||
module VagrantPlugins
|
||||
module ProviderVirtualBox
|
||||
module Action
|
||||
autoload :CheckAccessible, File.expand_path("../action/check_accessible", __FILE__)
|
||||
autoload :CheckVirtualbox, File.expand_path("../action/check_virtualbox", __FILE__)
|
||||
|
||||
# This is the action that is primarily responsible for completely
|
||||
# freeing the resources of the underlying virtual machine.
|
||||
def self.action_destroy
|
||||
Vagrant::Action::Builder.new.tap do |b|
|
||||
b.use CheckVirtualbox
|
||||
b.use Vagrant::Action::General::Validate
|
||||
b.use CheckAccessible
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,18 +1,18 @@
|
|||
module Vagrant
|
||||
module Action
|
||||
module VM
|
||||
module VagrantPlugins
|
||||
module ProviderVirtualBox
|
||||
module Action
|
||||
class CheckAccessible
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
if env[:vm].state == :inaccessible
|
||||
if env[:machine].state == :inaccessible
|
||||
# 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
|
||||
raise Vagrant::Errors::VMInaccessible
|
||||
end
|
||||
|
||||
@app.call(env)
|
|
@ -0,0 +1,22 @@
|
|||
module VagrantPlugins
|
||||
module ProviderVirtualBox
|
||||
module Action
|
||||
# Checks that VirtualBox is installed and ready to be used.
|
||||
class CheckVirtualbox
|
||||
def initialize(app, env)
|
||||
@app = app
|
||||
end
|
||||
|
||||
def call(env)
|
||||
# This verifies that VirtualBox is installed and the driver is
|
||||
# ready to function. If not, then an exception will be raised
|
||||
# which will break us out of execution of the middleware sequence.
|
||||
Driver::Meta.new.verify!
|
||||
|
||||
# Carry on.
|
||||
@app.call(env)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -15,6 +15,8 @@ module VagrantPlugins
|
|||
end
|
||||
end
|
||||
|
||||
autoload :Action, File.expand_path("../action", __FILE__)
|
||||
|
||||
# Drop some autoloads in here to optimize the performance of loading
|
||||
# our drivers only when they are needed.
|
||||
module Driver
|
||||
|
|
|
@ -6,8 +6,30 @@ module VagrantPlugins
|
|||
@driver = Driver::Meta.new(@machine.id)
|
||||
end
|
||||
|
||||
# @see Vagrant::Plugin::V1::Provider#action
|
||||
def action(name)
|
||||
# Attempt to get the action method from the Action class if it
|
||||
# exists, otherwise return nil to show that we don't support the
|
||||
# given action.
|
||||
action_method = "action_#{name}"
|
||||
return Action.send(action_method) if Action.respond_to?(action_method)
|
||||
nil
|
||||
end
|
||||
|
||||
# Returns a human-friendly string version of this provider which
|
||||
# includes the machine's ID that this provider represents, if it
|
||||
# has one.
|
||||
#
|
||||
# @return [String]
|
||||
def to_s
|
||||
id = @machine.id ? @machine.id : "new VM"
|
||||
"VirtualBox (#{id})"
|
||||
end
|
||||
|
||||
# Return the state of VirtualBox virtual machine by actually
|
||||
# querying VBoxManage.
|
||||
#
|
||||
# @return [Symbol]
|
||||
def state
|
||||
return :not_created if !@driver.uuid
|
||||
state = @driver.read_state
|
||||
|
|
|
@ -1,13 +1,7 @@
|
|||
require File.expand_path("../../../base", __FILE__)
|
||||
|
||||
describe Vagrant::Action::Runner do
|
||||
let(:registry) do
|
||||
d = double("registry")
|
||||
d.stub(:get)
|
||||
d
|
||||
end
|
||||
|
||||
let(:instance) { described_class.new(registry) }
|
||||
let(:instance) { described_class.new }
|
||||
|
||||
it "should raise an error if an invalid callable is given" do
|
||||
expect { instance.run(7) }.to raise_error(ArgumentError, /must be a callable/)
|
||||
|
@ -47,7 +41,7 @@ describe Vagrant::Action::Runner do
|
|||
result = env["data"]
|
||||
end
|
||||
|
||||
instance = described_class.new(registry, "data" => "bar")
|
||||
instance = described_class.new("data" => "bar")
|
||||
instance.run(callable)
|
||||
result.should == "bar"
|
||||
end
|
||||
|
@ -58,7 +52,7 @@ describe Vagrant::Action::Runner do
|
|||
result = env["data"]
|
||||
end
|
||||
|
||||
instance = described_class.new(registry) { { "data" => "bar" } }
|
||||
instance = described_class.new { { "data" => "bar" } }
|
||||
instance.run(callable)
|
||||
result.should == "bar"
|
||||
end
|
||||
|
|
|
@ -93,16 +93,6 @@ describe Vagrant::Environment do
|
|||
end
|
||||
end
|
||||
|
||||
describe "action registry" do
|
||||
it "has an action registry" do
|
||||
instance.action_registry.should be_kind_of(Vagrant::Registry)
|
||||
end
|
||||
|
||||
it "should have the built-in actions in the registry" do
|
||||
instance.action_registry.get(:provision).should_not be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe "primary VM" do
|
||||
it "should be the only VM if not a multi-VM environment" do
|
||||
instance.primary_vm.should == instance.vms.values.first
|
||||
|
|
Loading…
Reference in New Issue