diff --git a/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb b/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb new file mode 100644 index 000000000..1c024ea13 --- /dev/null +++ b/lib/vagrant/action/vm/destroy_unused_network_interfaces.rb @@ -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 diff --git a/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb b/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb new file mode 100644 index 000000000..ba38c0b3f --- /dev/null +++ b/test/vagrant/action/vm/destroy_unused_network_interfaces_test.rb @@ -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