Merge pull request #10383 from chrisroberts/e-vbox-default-nic

Add support for specifying the default NIC type used for guest adapters
This commit is contained in:
Chris Roberts 2018-11-08 14:39:35 -08:00 committed by GitHub
commit e4cc769b9e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 117 additions and 4 deletions

View File

@ -37,6 +37,8 @@ module VagrantPlugins
available_slots.delete(slot)
end
default_nic_type = env[:machine].provider_config.default_nic_type
@logger.debug("Available slots for high-level adapters: #{available_slots.inspect}")
@logger.info("Determining network adapters required for high-level configuration...")
available_slots = available_slots.to_a.sort
@ -44,6 +46,11 @@ module VagrantPlugins
# We only handle private and public networks
next if type != :private_network && type != :public_network
if default_nic_type && !options.key?(:nic_type) && !options.key?(:virtualbox__nic_type)
@logger.info("Setting default nic type (`#{default_nic_type}`) for `#{type}` - `#{options}`")
options[:virtualbox__nic_type] = default_nic_type
end
options = scoped_hash_override(options, :virtualbox)
# Figure out the slot that this adapter will go into
@ -403,15 +410,16 @@ module VagrantPlugins
end
def nat_config(options)
return {
return options.merge(
auto_config: false
}
)
end
def nat_adapter(config)
return {
adapter: config[:adapter],
type: :nat,
nic_type: config[:nic_type],
}
end

View File

@ -19,6 +19,13 @@ module VagrantPlugins
# @return [Array]
attr_reader :customizations
# Set the default type of NIC hardware to be used for network
# devices. By default this is "virtio". If it is set to `nil`
# no type will be set and VirtualBox's default will be used.
#
# @return [String]
attr_accessor :default_nic_type
# If true, unused network interfaces will automatically be deleted.
# This defaults to false because the detection does not work across
# multiple users, and because on Windows this operation requires
@ -68,6 +75,7 @@ module VagrantPlugins
@auto_nat_dns_proxy = UNSET_VALUE
@check_guest_additions = UNSET_VALUE
@customizations = []
@default_nic_type = UNSET_VALUE
@destroy_unused_network_interfaces = UNSET_VALUE
@functional_vboxsf = UNSET_VALUE
@name = UNSET_VALUE
@ -158,6 +166,9 @@ module VagrantPlugins
# The default name is just nothing, and we default it
@name = nil if @name == UNSET_VALUE
@default_nic_type = "virtio" if @default_nic_type == UNSET_VALUE
set_default_nic_type! if @default_nic_type
end
def validate(machine)
@ -190,6 +201,15 @@ module VagrantPlugins
{ "VirtualBox Provider" => errors }
end
def set_default_nic_type!
network_adapters.each do |_, args|
_, opts = args
if opts && !opts.key?(:nic_type)
opts[:nic_type] = @default_nic_type
end
end
end
def to_s
"VirtualBox"
end

View File

@ -84,6 +84,42 @@ describe VagrantPlugins::ProviderVirtualBox::Action::Network do
expect{ subject.call(env) }.not_to raise_error(Vagrant::Errors::NetworkAddressInvalid)
end
describe "setting nic type" do
before do
guest = double("guest")
allow(driver).to receive(:read_bridged_interfaces) { [] }
allow(driver).to receive(:read_host_only_interfaces) { [] }
allow(driver).to receive(:create_host_only_network) { {} }
allow(driver).to receive(:read_dhcp_servers) { [] }
allow(driver).to receive(:create_dhcp_server)
allow(machine).to receive(:guest) { guest }
allow(guest).to receive(:capability)
end
it "sets default nic type when unset" do
machine.config.vm.network 'private_network', { type: 'dhcp' }
subject.call(env)
_, net_config = machine.config.vm.networks.detect { |type, _| type == :private_network }
expect(net_config[:virtualbox__nic_type]).to eq("virtio")
end
it "does not set nic type when already set" do
machine.config.vm.network 'private_network', { type: 'dhcp', nic_type: "custom" }
subject.call(env)
_, net_config = machine.config.vm.networks.detect { |type, _| type == :private_network }
expect(net_config[:nic_type]).to eq("custom")
expect(net_config[:virtualbox__nic_type]).to be_nil
end
it "does not set nic type when namespaced option is set" do
machine.config.vm.network 'private_network', { type: 'dhcp', virtualbox__nic_type: "custom" }
subject.call(env)
_, net_config = machine.config.vm.networks.detect { |type, _| type == :private_network }
expect(net_config[:nic_type]).to be_nil
expect(net_config[:virtualbox__nic_type]).to eq("custom")
end
end
context "with a dhcp private network" do
let(:bridgedifs) { [] }
let(:hostonlyifs) { [] }
@ -118,7 +154,7 @@ describe VagrantPlugins::ProviderVirtualBox::Action::Network do
mac: nil,
name: nil,
netmask: "255.255.255.0",
nic_type: nil,
nic_type: "virtio",
type: :dhcp,
dhcp_ip: "172.28.128.2",
dhcp_lower: "172.28.128.3",

View File

@ -43,14 +43,42 @@ describe VagrantPlugins::ProviderVirtualBox::Config do
it { expect(subject.gui).to be(false) }
it { expect(subject.name).to be_nil }
it { expect(subject.functional_vboxsf).to be(true) }
it { expect(subject.default_nic_type).to eq("virtio") }
it "should have one NAT adapter" do
expect(subject.network_adapters).to eql({
1 => [:nat, {}],
1 => [:nat, {nic_type: "virtio"}],
})
end
end
describe "#default_nic_type" do
let(:nic_type) { "custom" }
before do
subject.default_nic_type = nic_type
subject.finalize!
end
it { expect(subject.default_nic_type).to eq(nic_type) }
it "should set NAT adapter nic type" do
expect(subject.network_adapters.values.first.last[:nic_type]).
to eq(nic_type)
end
context "when set to nil" do
let(:nic_type) { nil }
it { expect(subject.default_nic_type).to be_nil }
it "should not set NAT adapter nic type" do
expect(subject.network_adapters.values.first.last[:nic_type]).
to be_nil
end
end
end
describe "#merge" do
let(:one) { described_class.new }
let(:two) { described_class.new }

View File

@ -41,6 +41,27 @@ config.vm.provider "virtualbox" do |v|
end
```
## Default NIC Type
By default Vagrant will set the NIC type for all network interfaces to
`"virtio"`. If you would rather a different NIC type be used as the
default for guests:
```ruby
config.vm.provider "virtualbox" do |v|
v.default_nic_type = "82543GC"
end
```
or if you would like to disable the default type so VirtualBox's default
is applied you can set the value to `nil`:
```ruby
config.vm.provider "virtualbox" do |v|
v.default_nic_type = nil
end
```
## Linked Clones
By default new machines are created by importing the base box. For large