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:
commit
e4cc769b9e
|
@ -37,6 +37,8 @@ module VagrantPlugins
|
||||||
available_slots.delete(slot)
|
available_slots.delete(slot)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
default_nic_type = env[:machine].provider_config.default_nic_type
|
||||||
|
|
||||||
@logger.debug("Available slots for high-level adapters: #{available_slots.inspect}")
|
@logger.debug("Available slots for high-level adapters: #{available_slots.inspect}")
|
||||||
@logger.info("Determining network adapters required for high-level configuration...")
|
@logger.info("Determining network adapters required for high-level configuration...")
|
||||||
available_slots = available_slots.to_a.sort
|
available_slots = available_slots.to_a.sort
|
||||||
|
@ -44,6 +46,11 @@ module VagrantPlugins
|
||||||
# We only handle private and public networks
|
# We only handle private and public networks
|
||||||
next if type != :private_network && type != :public_network
|
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)
|
options = scoped_hash_override(options, :virtualbox)
|
||||||
|
|
||||||
# Figure out the slot that this adapter will go into
|
# Figure out the slot that this adapter will go into
|
||||||
|
@ -403,15 +410,16 @@ module VagrantPlugins
|
||||||
end
|
end
|
||||||
|
|
||||||
def nat_config(options)
|
def nat_config(options)
|
||||||
return {
|
return options.merge(
|
||||||
auto_config: false
|
auto_config: false
|
||||||
}
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def nat_adapter(config)
|
def nat_adapter(config)
|
||||||
return {
|
return {
|
||||||
adapter: config[:adapter],
|
adapter: config[:adapter],
|
||||||
type: :nat,
|
type: :nat,
|
||||||
|
nic_type: config[:nic_type],
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,13 @@ module VagrantPlugins
|
||||||
# @return [Array]
|
# @return [Array]
|
||||||
attr_reader :customizations
|
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.
|
# If true, unused network interfaces will automatically be deleted.
|
||||||
# This defaults to false because the detection does not work across
|
# This defaults to false because the detection does not work across
|
||||||
# multiple users, and because on Windows this operation requires
|
# multiple users, and because on Windows this operation requires
|
||||||
|
@ -68,6 +75,7 @@ module VagrantPlugins
|
||||||
@auto_nat_dns_proxy = UNSET_VALUE
|
@auto_nat_dns_proxy = UNSET_VALUE
|
||||||
@check_guest_additions = UNSET_VALUE
|
@check_guest_additions = UNSET_VALUE
|
||||||
@customizations = []
|
@customizations = []
|
||||||
|
@default_nic_type = UNSET_VALUE
|
||||||
@destroy_unused_network_interfaces = UNSET_VALUE
|
@destroy_unused_network_interfaces = UNSET_VALUE
|
||||||
@functional_vboxsf = UNSET_VALUE
|
@functional_vboxsf = UNSET_VALUE
|
||||||
@name = UNSET_VALUE
|
@name = UNSET_VALUE
|
||||||
|
@ -158,6 +166,9 @@ module VagrantPlugins
|
||||||
|
|
||||||
# The default name is just nothing, and we default it
|
# The default name is just nothing, and we default it
|
||||||
@name = nil if @name == UNSET_VALUE
|
@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
|
end
|
||||||
|
|
||||||
def validate(machine)
|
def validate(machine)
|
||||||
|
@ -190,6 +201,15 @@ module VagrantPlugins
|
||||||
{ "VirtualBox Provider" => errors }
|
{ "VirtualBox Provider" => errors }
|
||||||
end
|
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
|
def to_s
|
||||||
"VirtualBox"
|
"VirtualBox"
|
||||||
end
|
end
|
||||||
|
|
|
@ -84,6 +84,42 @@ describe VagrantPlugins::ProviderVirtualBox::Action::Network do
|
||||||
expect{ subject.call(env) }.not_to raise_error(Vagrant::Errors::NetworkAddressInvalid)
|
expect{ subject.call(env) }.not_to raise_error(Vagrant::Errors::NetworkAddressInvalid)
|
||||||
end
|
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
|
context "with a dhcp private network" do
|
||||||
let(:bridgedifs) { [] }
|
let(:bridgedifs) { [] }
|
||||||
let(:hostonlyifs) { [] }
|
let(:hostonlyifs) { [] }
|
||||||
|
@ -118,7 +154,7 @@ describe VagrantPlugins::ProviderVirtualBox::Action::Network do
|
||||||
mac: nil,
|
mac: nil,
|
||||||
name: nil,
|
name: nil,
|
||||||
netmask: "255.255.255.0",
|
netmask: "255.255.255.0",
|
||||||
nic_type: nil,
|
nic_type: "virtio",
|
||||||
type: :dhcp,
|
type: :dhcp,
|
||||||
dhcp_ip: "172.28.128.2",
|
dhcp_ip: "172.28.128.2",
|
||||||
dhcp_lower: "172.28.128.3",
|
dhcp_lower: "172.28.128.3",
|
||||||
|
|
|
@ -43,14 +43,42 @@ describe VagrantPlugins::ProviderVirtualBox::Config do
|
||||||
it { expect(subject.gui).to be(false) }
|
it { expect(subject.gui).to be(false) }
|
||||||
it { expect(subject.name).to be_nil }
|
it { expect(subject.name).to be_nil }
|
||||||
it { expect(subject.functional_vboxsf).to be(true) }
|
it { expect(subject.functional_vboxsf).to be(true) }
|
||||||
|
it { expect(subject.default_nic_type).to eq("virtio") }
|
||||||
|
|
||||||
it "should have one NAT adapter" do
|
it "should have one NAT adapter" do
|
||||||
expect(subject.network_adapters).to eql({
|
expect(subject.network_adapters).to eql({
|
||||||
1 => [:nat, {}],
|
1 => [:nat, {nic_type: "virtio"}],
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
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
|
describe "#merge" do
|
||||||
let(:one) { described_class.new }
|
let(:one) { described_class.new }
|
||||||
let(:two) { described_class.new }
|
let(:two) { described_class.new }
|
||||||
|
|
|
@ -41,6 +41,27 @@ config.vm.provider "virtualbox" do |v|
|
||||||
end
|
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
|
## Linked Clones
|
||||||
|
|
||||||
By default new machines are created by importing the base box. For large
|
By default new machines are created by importing the base box. For large
|
||||||
|
|
Loading…
Reference in New Issue