219 lines
7.0 KiB
Ruby
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
|