Merge pull request #1132 from rasa/1123-use-local-vboxguestadditions-iso

virtualbox: use local VBoxGuestAdditions.iso by default
This commit is contained in:
Mitchell Hashimoto 2014-05-06 18:54:13 -07:00
commit 0b63f4f9dc
5 changed files with 67 additions and 15 deletions

View File

@ -25,6 +25,9 @@ type Driver interface {
// Import a VM // Import a VM
Import(string, string, string) error Import(string, string, string) error
// The complete path to the Guest Additions ISO
Iso() (string, error)
// Checks if the VM with the given name is running. // Checks if the VM with the given name is running.
IsRunning(string) (bool, error) IsRunning(string) (bool, error)

View File

@ -40,6 +40,35 @@ func (d *VBox42Driver) Delete(name string) error {
return d.VBoxManage("unregistervm", name, "--delete") return d.VBoxManage("unregistervm", name, "--delete")
} }
func (d *VBox42Driver) Iso() (string, error) {
var stdout bytes.Buffer
cmd := exec.Command(d.VBoxManagePath, "list", "systemproperties")
cmd.Stdout = &stdout
if err := cmd.Run(); err != nil {
return "", err
}
DefaultGuestAdditionsRe := regexp.MustCompile("Default Guest Additions ISO:(.*)")
for _, line := range strings.Split(stdout.String(), "\n") {
// Need to trim off CR character when running in windows
line = strings.TrimRight(line, "\r")
matches := DefaultGuestAdditionsRe.FindStringSubmatch(line)
if matches == nil {
continue
}
isoname := strings.Trim(matches[1], " \r\n")
log.Printf("Found Default Guest Additions ISO: %s", isoname)
return isoname, nil
}
return "", fmt.Errorf("Cannot find \"Default Guest Additions ISO\" in vboxmanage output")
}
func (d *VBox42Driver) Import(name, path, opts string) error { func (d *VBox42Driver) Import(name, path, opts string) error {
args := []string{ args := []string{
"import", path, "import", path,

View File

@ -19,6 +19,9 @@ type DriverMock struct {
ImportOpts string ImportOpts string
ImportErr error ImportErr error
IsoCalled bool
IsoErr error
IsRunningName string IsRunningName string
IsRunningReturn bool IsRunningReturn bool
IsRunningErr error IsRunningErr error
@ -60,6 +63,11 @@ func (d *DriverMock) Import(name, path, opts string) error {
return d.ImportErr return d.ImportErr
} }
func (d *DriverMock) Iso() (string, error) {
d.IsoCalled = true
return "", d.IsoErr
}
func (d *DriverMock) IsRunning(name string) (bool, error) { func (d *DriverMock) IsRunning(name string) (bool, error) {
d.Lock() d.Lock()
defer d.Unlock() defer d.Unlock()

View File

@ -62,14 +62,7 @@ func (s *StepDownloadGuestAdditions) Run(state multistep.StateBag) multistep.Ste
// Use provided version or get it from virtualbox.org // Use provided version or get it from virtualbox.org
var checksum string var checksum string
if s.GuestAdditionsSHA256 != "" { checksumType := "sha256"
checksum = s.GuestAdditionsSHA256
} else {
checksum, action = s.downloadAdditionsSHA256(state, version, additionsName)
if action != multistep.ActionContinue {
return action
}
}
// Use the provided source (URL or file path) or generate it // Use the provided source (URL or file path) or generate it
url := s.GuestAdditionsURL url := s.GuestAdditionsURL
@ -86,10 +79,28 @@ func (s *StepDownloadGuestAdditions) Run(state multistep.StateBag) multistep.Ste
return multistep.ActionHalt return multistep.ActionHalt
} }
} else { } else {
url = fmt.Sprintf( url, err = driver.Iso()
"http://download.virtualbox.org/virtualbox/%s/%s",
version, if err == nil {
additionsName) checksumType = "none"
} else {
ui.Error(err.Error())
url = fmt.Sprintf(
"http://download.virtualbox.org/virtualbox/%s/%s",
version,
additionsName)
}
}
if checksumType != "none" {
if s.GuestAdditionsSHA256 != "" {
checksum = s.GuestAdditionsSHA256
} else {
checksum, action = s.downloadAdditionsSHA256(state, version, additionsName)
if action != multistep.ActionContinue {
return action
}
}
} }
url, err = common.DownloadableURL(url) url, err = common.DownloadableURL(url)
@ -104,7 +115,7 @@ func (s *StepDownloadGuestAdditions) Run(state multistep.StateBag) multistep.Ste
downStep := &common.StepDownload{ downStep := &common.StepDownload{
Checksum: checksum, Checksum: checksum,
ChecksumType: "sha256", ChecksumType: checksumType,
Description: "Guest additions", Description: "Guest additions",
ResultKey: "guest_additions_path", ResultKey: "guest_additions_path",
Url: []string{url}, Url: []string{url},

View File

@ -121,8 +121,9 @@ each category, the available options are alphabetized and described.
* `guest_additions_url` (string) - The URL to the guest additions ISO * `guest_additions_url` (string) - The URL to the guest additions ISO
to upload. This can also be a file URL if the ISO is at a local path. to upload. This can also be a file URL if the ISO is at a local path.
By default the VirtualBox builder will go and download the proper By default, the VirtualBox builder will attempt to find the guest additions
guest additions ISO from the internet. ISO on the local file system. If it is not available locally, the builder
will download the proper guest additions ISO from the internet.
* `guest_os_type` (string) - The guest OS type being installed. By default * `guest_os_type` (string) - The guest OS type being installed. By default
this is "other", but you can get _dramatic_ performance improvements by this is "other", but you can get _dramatic_ performance improvements by