Chris Roberts d8bbc5ce09 Add support for specifying the default NIC type used for guest adapters
Provides support for defining the NIC type used for any guest adapter
which does not define an adapter type. This is defaulted to "virtio".
2018-11-07 15:53:46 -08:00

219 lines
7.0 KiB
Ruby

module VagrantPlugins
module ProviderVirtualBox
class Config < Vagrant.plugin("2", :config)
# Vagrant by default will make "smart" decisions to enable/disable
# the NAT DNS proxy. If this is set to `true`, then the DNS proxy
# will not be enabled, and it is up to the end user to do it.
#
# @return [Boolean]
attr_accessor :auto_nat_dns_proxy
# If true, will check if guest additions are installed and up to
# date. By default, this is true.
#
# @return [Boolean]
attr_accessor :check_guest_additions
# An array of customizations to make on the VM prior to booting it.
#
# @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
# administrative privileges.
#
# @return [Boolean]
attr_accessor :destroy_unused_network_interfaces
# If set to `true`, then VirtualBox will be launched with a GUI.
#
# @return [Boolean]
attr_accessor :gui
# If set to `true`, then a linked clone is created from a master
# VM generated from the specified box.
#
# @return [Boolean]
attr_accessor :linked_clone
# The snapshot to base the linked clone from. If this isn't set
# a snapshot will be made with the name of "base" which will be used.
#
# If this is set, then the snapshot must already exist.
#
# @return [String]
attr_accessor :linked_clone_snapshot
# This should be set to the name of the machine in the VirtualBox
# GUI.
#
# @return [String]
attr_accessor :name
# Whether or not this VM has a functional vboxsf filesystem module.
# This defaults to true. If you set this to false, then the "virtualbox"
# synced folder type won't be valid.
#
# @return [Boolean]
attr_accessor :functional_vboxsf
# The defined network adapters.
#
# @return [Hash]
attr_reader :network_adapters
def initialize
@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
@network_adapters = {}
@gui = UNSET_VALUE
@linked_clone = UNSET_VALUE
@linked_clone_snapshot = UNSET_VALUE
# We require that network adapter 1 is a NAT device.
network_adapter(1, :nat)
end
# Customize the VM by calling `VBoxManage` with the given
# arguments.
#
# When called multiple times, the customizations will be applied
# in the order given.
#
# The special `:name` parameter in the command will be replaced with
# the unique ID or name of the virtual machine. This is useful for
# parameters to `modifyvm` and the like.
#
# @param [Array] command An array of arguments to pass to
# VBoxManage.
def customize(*command)
event = command.first.is_a?(String) ? command.shift : "pre-boot"
command = command[0]
@customizations << [event, command]
end
# This defines a network adapter that will be added to the VirtualBox
# virtual machine in the given slot.
#
# @param [Integer] slot The slot for this network adapter.
# @param [Symbol] type The type of adapter.
def network_adapter(slot, type, **opts)
@network_adapters[slot] = [type, opts]
end
# Shortcut for setting memory size for the virtual machine.
# Calls #customize internally.
#
# @param size [Integer, String] the memory size in MB
def memory=(size)
customize("pre-boot", ["modifyvm", :id, "--memory", size.to_s])
end
# Shortcut for setting CPU count for the virtual machine.
# Calls #customize internally.
#
# @param count [Integer, String] the count of CPUs
def cpus=(count)
customize("pre-boot", ["modifyvm", :id, "--cpus", count.to_i])
end
def merge(other)
super.tap do |result|
c = customizations.dup
c += other.customizations
result.instance_variable_set(:@customizations, c)
end
end
# This is the hook that is called to finalize the object before it
# is put into use.
def finalize!
# Default is to auto the DNS proxy
@auto_nat_dns_proxy = true if @auto_nat_dns_proxy == UNSET_VALUE
if @check_guest_additions == UNSET_VALUE
@check_guest_additions = true
end
if @destroy_unused_network_interfaces == UNSET_VALUE
@destroy_unused_network_interfaces = false
end
if @functional_vboxsf == UNSET_VALUE
@functional_vboxsf = true
end
# Default is to not show a GUI
@gui = false if @gui == UNSET_VALUE
# Do not create linked clone by default
@linked_clone = false if @linked_clone == UNSET_VALUE
@linked_clone_snapshot = nil if @linked_clone_snapshot == UNSET_VALUE
# 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)
errors = _detected_errors
valid_events = ["pre-import", "pre-boot", "post-boot", "post-comm"]
@customizations.each do |event, _|
if !valid_events.include?(event)
errors << I18n.t(
"vagrant.virtualbox.config.invalid_event",
event: event.to_s,
valid_events: valid_events.join(", "))
end
end
@customizations.each do |event, command|
if event == "pre-import" && command.index(:id)
errors << I18n.t("vagrant.virtualbox.config.id_in_pre_import")
end
end
# Verify that internal networks are only on private networks.
machine.config.vm.networks.each do |type, data|
if data[:virtualbox__intnet] && type != :private_network
errors << I18n.t("vagrant.virtualbox.config.intnet_on_bad_type")
break
end
end
{ "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
end
end
end