Middleware to destroy unused network interfaces
This commit is contained in:
parent
7d6c0db4ae
commit
f258746384
|
@ -0,0 +1,33 @@
|
||||||
|
module Vagrant
|
||||||
|
class Action
|
||||||
|
module VM
|
||||||
|
class DestroyUnusedNetworkInterfaces
|
||||||
|
def initialize(app, env)
|
||||||
|
@app = app
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(env)
|
||||||
|
# We need to check if the host only network specified by any
|
||||||
|
# of the adapters would not have any more clients if it was
|
||||||
|
# destroyed. And if so, then destroy the host only network
|
||||||
|
# itself.
|
||||||
|
interfaces = env["vm"].vm.network_adapters.collect do |adapter|
|
||||||
|
adapter.host_interface_object
|
||||||
|
end
|
||||||
|
|
||||||
|
interfaces.compact.uniq.each do |interface|
|
||||||
|
# Destroy the network interface if there is only one
|
||||||
|
# attached VM (which must be this VM)
|
||||||
|
if interface.attached_vms.length == 1
|
||||||
|
env.logger.info "Destroying unused network interface..."
|
||||||
|
interface.destroy
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Continue along
|
||||||
|
@app.call(env)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,46 @@
|
||||||
|
require File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper')
|
||||||
|
|
||||||
|
class DestroyUnusedNetworkInterfacesVMActionTest < Test::Unit::TestCase
|
||||||
|
setup do
|
||||||
|
@klass = Vagrant::Action::VM::DestroyUnusedNetworkInterfaces
|
||||||
|
@app, @env = mock_action_data
|
||||||
|
|
||||||
|
@vm = mock("vm")
|
||||||
|
@env["vm"] = @vm
|
||||||
|
|
||||||
|
@internal_vm = mock("internal")
|
||||||
|
@vm.stubs(:vm).returns(@internal_vm)
|
||||||
|
|
||||||
|
@instance = @klass.new(@app, @env)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "calling" do
|
||||||
|
setup do
|
||||||
|
@network_adapters = []
|
||||||
|
@internal_vm.stubs(:network_adapters).returns(@network_adapters)
|
||||||
|
end
|
||||||
|
|
||||||
|
def stub_interface(length=5)
|
||||||
|
interface = mock("interface")
|
||||||
|
adapter = mock("adapter")
|
||||||
|
adapter.stubs(:host_interface_object).returns(interface)
|
||||||
|
interface.stubs(:attached_vms).returns(Array.new(length))
|
||||||
|
|
||||||
|
@network_adapters << adapter
|
||||||
|
interface
|
||||||
|
end
|
||||||
|
|
||||||
|
should "destroy only the unused network interfaces" do
|
||||||
|
stub_interface(5)
|
||||||
|
stub_interface(7)
|
||||||
|
results = [stub_interface(1), stub_interface(1)]
|
||||||
|
|
||||||
|
results.each do |result|
|
||||||
|
result.expects(:destroy).once
|
||||||
|
end
|
||||||
|
|
||||||
|
@app.expects(:call).with(@env).once
|
||||||
|
@instance.call(@env)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue