2019-05-31 08:27:41 -04:00
|
|
|
//go:generate struct-markdown
|
|
|
|
|
2019-03-16 12:15:27 -04:00
|
|
|
package common
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2020-09-11 17:15:17 -04:00
|
|
|
"strings"
|
2019-03-16 12:15:27 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
// These are the different valid mode values for "guest_additions_mode" which
|
|
|
|
// determine how guest additions are delivered to the guest.
|
|
|
|
const (
|
|
|
|
GuestAdditionsModeDisable string = "disable"
|
|
|
|
GuestAdditionsModeAttach = "attach"
|
|
|
|
GuestAdditionsModeUpload = "upload"
|
|
|
|
)
|
|
|
|
|
|
|
|
type GuestAdditionsConfig struct {
|
2019-05-28 11:50:58 -04:00
|
|
|
// The method by which guest additions are
|
2020-09-11 17:15:17 -04:00
|
|
|
// made available to the guest for installation. Valid options are `upload`,
|
|
|
|
// `attach`, or `disable`. If the mode is `attach` the guest additions ISO will
|
|
|
|
// be attached as a CD device to the virtual machine. If the mode is `upload`
|
2019-06-06 10:29:25 -04:00
|
|
|
// the guest additions ISO will be uploaded to the path specified by
|
2020-09-11 17:15:17 -04:00
|
|
|
// `guest_additions_path`. The default value is `upload`. If `disable` is used,
|
2019-06-06 10:29:25 -04:00
|
|
|
// guest additions won't be downloaded, either.
|
2020-09-11 17:15:17 -04:00
|
|
|
GuestAdditionsMode string `mapstructure:"guest_additions_mode"`
|
|
|
|
// The interface type to use to mount guest additions when
|
|
|
|
// guest_additions_mode is set to attach. Will default to the value set in
|
|
|
|
// iso_interface, if iso_interface is set. Will default to "ide", if
|
|
|
|
// iso_interface is not set. Options are "ide" and "sata".
|
|
|
|
GuestAdditionsInterface string `mapstructure:"guest_additions_interface" required:"false"`
|
|
|
|
// The path on the guest virtual machine
|
|
|
|
// where the VirtualBox guest additions ISO will be uploaded. By default this
|
|
|
|
// is `VBoxGuestAdditions.iso` which should upload into the login directory of
|
|
|
|
// the user. This is a [configuration
|
|
|
|
// template](/docs/templates/engine) where the `Version`
|
|
|
|
// variable is replaced with the VirtualBox version.
|
|
|
|
GuestAdditionsPath string `mapstructure:"guest_additions_path"`
|
|
|
|
// The SHA256 checksum of the guest
|
|
|
|
// additions ISO that will be uploaded to the guest VM. By default the
|
|
|
|
// checksums will be downloaded from the VirtualBox website, so this only needs
|
|
|
|
// to be set if you want to be explicit about the checksum.
|
|
|
|
GuestAdditionsSHA256 string `mapstructure:"guest_additions_sha256"`
|
|
|
|
// The URL of the guest additions ISO
|
|
|
|
// to upload. This can also be a file URL if the ISO is at a local path. By
|
|
|
|
// default, the VirtualBox builder will attempt to find the guest additions ISO
|
|
|
|
// on the local file system. If it is not available locally, the builder will
|
|
|
|
// download the proper guest additions ISO from the internet.
|
|
|
|
GuestAdditionsURL string `mapstructure:"guest_additions_url" required:"false"`
|
2019-03-16 12:15:27 -04:00
|
|
|
}
|
|
|
|
|
2020-11-18 15:43:05 -05:00
|
|
|
func (c *GuestAdditionsConfig) Prepare(communicatorType string) []error {
|
2019-03-16 12:15:27 -04:00
|
|
|
var errs []error
|
|
|
|
|
2020-09-11 17:15:17 -04:00
|
|
|
if c.GuestAdditionsMode == "" {
|
|
|
|
c.GuestAdditionsMode = "upload"
|
|
|
|
}
|
|
|
|
|
|
|
|
if c.GuestAdditionsPath == "" {
|
|
|
|
c.GuestAdditionsPath = "VBoxGuestAdditions.iso"
|
|
|
|
}
|
|
|
|
|
|
|
|
if c.GuestAdditionsSHA256 != "" {
|
|
|
|
c.GuestAdditionsSHA256 = strings.ToLower(c.GuestAdditionsSHA256)
|
|
|
|
}
|
|
|
|
|
|
|
|
validMode := false
|
|
|
|
validModes := []string{
|
|
|
|
GuestAdditionsModeDisable,
|
|
|
|
GuestAdditionsModeAttach,
|
|
|
|
GuestAdditionsModeUpload,
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, mode := range validModes {
|
|
|
|
if c.GuestAdditionsMode == mode {
|
|
|
|
validMode = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if !validMode {
|
|
|
|
errs = append(errs,
|
|
|
|
fmt.Errorf("guest_additions_mode is invalid. Must be one of: %v", validModes))
|
|
|
|
}
|
|
|
|
|
2020-11-24 18:39:43 -05:00
|
|
|
if communicatorType == "none" && c.GuestAdditionsMode == "upload" {
|
|
|
|
errs = append(errs, fmt.Errorf("communicator must not be 'none' "+
|
|
|
|
"when guest_additions_mode = 'upload'."))
|
2020-11-18 15:43:05 -05:00
|
|
|
}
|
|
|
|
|
2019-03-16 12:15:27 -04:00
|
|
|
return errs
|
|
|
|
}
|