diff --git a/docs/configuration.markdown b/docs/configuration.markdown index 4a0bb38..21633f5 100644 --- a/docs/configuration.markdown +++ b/docs/configuration.markdown @@ -512,6 +512,14 @@ virtual network. are listed [here](http://www.libvirt.org/formatdomain.html#elementsNICSDirect). Default is 'false'. +Additionally for public networks, to facilitate validating if the device provided +can be used, vagrant-libvirt will check both the host interfaces visible to libvirt +and the existing networks for any existing bridge names. While some name patterns are +automatically excluded as presumed incorrect, if this pattern list is incorrect +it may be overridden by setting the option: +* `host_device_exclude_prefixes` - ignore any device starting with any of these + string patterns as a valid bridge device for a public network definition. + ### Management Network vagrant-libvirt uses a private network to perform some management operations on diff --git a/lib/vagrant-libvirt/config.rb b/lib/vagrant-libvirt/config.rb index 1337236..0dc868b 100644 --- a/lib/vagrant-libvirt/config.rb +++ b/lib/vagrant-libvirt/config.rb @@ -1213,7 +1213,11 @@ module VagrantPlugins def host_devices(machine) @host_devices ||= begin - machine.provider.driver.connection.client.list_all_interfaces().map { |iface| iface.name }.uniq.select do |dev| + ( + machine.provider.driver.list_host_devices.map { |iface| iface.name } + + machine.provider.driver.list_networks.map { |net| net.bridge_name } + ).uniq.select do |dev| + next if dev.empty? dev != "lo" && !@host_device_exclude_prefixes.any? { |exclude| dev.start_with?(exclude) } end end diff --git a/lib/vagrant-libvirt/driver.rb b/lib/vagrant-libvirt/driver.rb index 72f0e59..caa80fd 100644 --- a/lib/vagrant-libvirt/driver.rb +++ b/lib/vagrant-libvirt/driver.rb @@ -201,6 +201,14 @@ module VagrantPlugins state end + def list_host_devices + @connection.client.list_all_interfaces + end + + def list_networks + @connection.client.list_all_networks + end + private def get_ipaddress_from_system(mac) diff --git a/spec/unit/config_spec.rb b/spec/unit/config_spec.rb index d8d4816..989d044 100644 --- a/spec/unit/config_spec.rb +++ b/spec/unit/config_spec.rb @@ -640,12 +640,20 @@ describe VagrantPlugins::ProviderLibvirt::Config do instance_double(Libvirt::Interface), instance_double(Libvirt::Interface), ] } + let(:libvirt_networks) { [ + instance_double(Libvirt::Network), + instance_double(Libvirt::Network), + ] } + let(:driver) { instance_double(::VagrantPlugins::ProviderLibvirt::Driver) } before do machine.config.vm.network :public_network, dev: 'eth0', ip: "192.168.2.157" - expect(machine).to receive_message_chain('provider.driver.connection.client').and_return(libvirt_client) - expect(libvirt_client).to receive(:list_all_interfaces).and_return(host_devices) + allow(machine.provider).to receive(:driver).and_return(driver) + expect(driver).to receive(:list_host_devices).and_return(host_devices) + expect(driver).to receive(:list_networks).and_return(libvirt_networks) expect(host_devices[0]).to receive(:name).and_return('eth0') expect(host_devices[1]).to receive(:name).and_return('virbr0') + expect(libvirt_networks[0]).to receive(:bridge_name).and_return('') + expect(libvirt_networks[1]).to receive(:bridge_name).and_return('virbr0') end it 'should validate use of existing device' do