From 5f1c5972694c9a7df90a357474e8cd608c9fd89e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sun, 22 Dec 2013 11:50:29 -0800 Subject: [PATCH] builder/virtualbox: StepUploadVersion --- .../{iso => common}/step_upload_version.go | 18 +++++----- .../virtualbox/common/vbox_version_config.go | 31 +++++++++++++++++ .../common/vbox_version_config_test.go | 33 ++++++++++++++++++ builder/virtualbox/iso/builder.go | 30 ++++++++-------- builder/virtualbox/iso/builder_test.go | 34 ------------------- builder/virtualbox/ovf/builder.go | 4 ++- builder/virtualbox/ovf/config.go | 2 ++ 7 files changed, 92 insertions(+), 60 deletions(-) rename builder/virtualbox/{iso => common}/step_upload_version.go (66%) create mode 100644 builder/virtualbox/common/vbox_version_config.go create mode 100644 builder/virtualbox/common/vbox_version_config_test.go diff --git a/builder/virtualbox/iso/step_upload_version.go b/builder/virtualbox/common/step_upload_version.go similarity index 66% rename from builder/virtualbox/iso/step_upload_version.go rename to builder/virtualbox/common/step_upload_version.go index 3517d4f82..1bfd526a6 100644 --- a/builder/virtualbox/iso/step_upload_version.go +++ b/builder/virtualbox/common/step_upload_version.go @@ -1,25 +1,25 @@ -package iso +package common import ( "bytes" "fmt" "github.com/mitchellh/multistep" - vboxcommon "github.com/mitchellh/packer/builder/virtualbox/common" "github.com/mitchellh/packer/packer" "log" ) // This step uploads a file containing the VirtualBox version, which // can be useful for various provisioning reasons. -type stepUploadVersion struct{} +type StepUploadVersion struct { + Path string +} -func (s *stepUploadVersion) Run(state multistep.StateBag) multistep.StepAction { +func (s *StepUploadVersion) Run(state multistep.StateBag) multistep.StepAction { comm := state.Get("communicator").(packer.Communicator) - config := state.Get("config").(*config) - driver := state.Get("driver").(vboxcommon.Driver) + driver := state.Get("driver").(Driver) ui := state.Get("ui").(packer.Ui) - if config.VBoxVersionFile == "" { + if s.Path == "" { log.Println("VBoxVersionFile is empty. Not uploading.") return multistep.ActionContinue } @@ -33,7 +33,7 @@ func (s *stepUploadVersion) Run(state multistep.StateBag) multistep.StepAction { ui.Say(fmt.Sprintf("Uploading VirtualBox version info (%s)", version)) var data bytes.Buffer data.WriteString(version) - if err := comm.Upload(config.VBoxVersionFile, &data); err != nil { + if err := comm.Upload(s.Path, &data); err != nil { state.Put("error", fmt.Errorf("Error uploading VirtualBox version: %s", err)) return multistep.ActionHalt } @@ -41,4 +41,4 @@ func (s *stepUploadVersion) Run(state multistep.StateBag) multistep.StepAction { return multistep.ActionContinue } -func (s *stepUploadVersion) Cleanup(state multistep.StateBag) {} +func (s *StepUploadVersion) Cleanup(state multistep.StateBag) {} diff --git a/builder/virtualbox/common/vbox_version_config.go b/builder/virtualbox/common/vbox_version_config.go new file mode 100644 index 000000000..ff2c14819 --- /dev/null +++ b/builder/virtualbox/common/vbox_version_config.go @@ -0,0 +1,31 @@ +package common + +import ( + "fmt" + "github.com/mitchellh/packer/packer" +) + +type VBoxVersionConfig struct { + VBoxVersionFile string `mapstructure:"virtualbox_version_file"` +} + +func (c *VBoxVersionConfig) Prepare(t *packer.ConfigTemplate) []error { + if c.VBoxVersionFile == "" { + c.VBoxVersionFile = ".vbox_version" + } + + templates := map[string]*string{ + "virtualbox_version_file": &c.VBoxVersionFile, + } + + errs := make([]error, 0) + for n, ptr := range templates { + var err error + *ptr, err = t.Process(*ptr, nil) + if err != nil { + errs = append(errs, fmt.Errorf("Error processing %s: %s", n, err)) + } + } + + return errs +} diff --git a/builder/virtualbox/common/vbox_version_config_test.go b/builder/virtualbox/common/vbox_version_config_test.go new file mode 100644 index 000000000..d4cc85565 --- /dev/null +++ b/builder/virtualbox/common/vbox_version_config_test.go @@ -0,0 +1,33 @@ +package common + +import ( + "testing" +) + +func TestVBoxVersionConfigPrepare_BootWait(t *testing.T) { + var c *VBoxVersionConfig + var errs []error + + // Test empty + c = new(VBoxVersionConfig) + errs = c.Prepare(testConfigTemplate(t)) + if len(errs) > 0 { + t.Fatalf("should not have error: %s", errs) + } + + if c.VBoxVersionFile != ".vbox_version" { + t.Fatalf("bad value: %s", c.VBoxVersionFile) + } + + // Test with a good one + c = new(VBoxVersionConfig) + c.VBoxVersionFile = "foo" + errs = c.Prepare(testConfigTemplate(t)) + if len(errs) > 0 { + t.Fatalf("should not have error: %s", errs) + } + + if c.VBoxVersionFile != "foo" { + t.Fatalf("bad value: %s", c.VBoxVersionFile) + } +} diff --git a/builder/virtualbox/iso/builder.go b/builder/virtualbox/iso/builder.go index 8ea630695..d5402087c 100644 --- a/builder/virtualbox/iso/builder.go +++ b/builder/virtualbox/iso/builder.go @@ -35,6 +35,7 @@ type config struct { vboxcommon.ShutdownConfig `mapstructure:",squash"` vboxcommon.SSHConfig `mapstructure:",squash"` vboxcommon.VBoxManageConfig `mapstructure:",squash"` + vboxcommon.VBoxVersionConfig `mapstructure:",squash"` BootCommand []string `mapstructure:"boot_command"` DiskSize uint `mapstructure:"disk_size"` @@ -50,7 +51,6 @@ type config struct { ISOChecksum string `mapstructure:"iso_checksum"` ISOChecksumType string `mapstructure:"iso_checksum_type"` ISOUrls []string `mapstructure:"iso_urls"` - VBoxVersionFile string `mapstructure:"virtualbox_version_file"` VMName string `mapstructure:"vm_name"` RawSingleISOUrl string `mapstructure:"iso_url"` @@ -79,6 +79,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.SSHConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.VBoxManageConfig.Prepare(b.config.tpl)...) + errs = packer.MultiErrorAppend(errs, b.config.VBoxVersionConfig.Prepare(b.config.tpl)...) warnings := make([]string, 0) if b.config.DiskSize == 0 { @@ -109,26 +110,21 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { b.config.HTTPPortMax = 9000 } - if b.config.VBoxVersionFile == "" { - b.config.VBoxVersionFile = ".vbox_version" - } - if b.config.VMName == "" { b.config.VMName = fmt.Sprintf("packer-%s", b.config.PackerBuildName) } // Errors templates := map[string]*string{ - "guest_additions_mode": &b.config.GuestAdditionsMode, - "guest_additions_sha256": &b.config.GuestAdditionsSHA256, - "guest_os_type": &b.config.GuestOSType, - "hard_drive_interface": &b.config.HardDriveInterface, - "http_directory": &b.config.HTTPDir, - "iso_checksum": &b.config.ISOChecksum, - "iso_checksum_type": &b.config.ISOChecksumType, - "iso_url": &b.config.RawSingleISOUrl, - "virtualbox_version_file": &b.config.VBoxVersionFile, - "vm_name": &b.config.VMName, + "guest_additions_mode": &b.config.GuestAdditionsMode, + "guest_additions_sha256": &b.config.GuestAdditionsSHA256, + "guest_os_type": &b.config.GuestOSType, + "hard_drive_interface": &b.config.HardDriveInterface, + "http_directory": &b.config.HTTPDir, + "iso_checksum": &b.config.ISOChecksum, + "iso_checksum_type": &b.config.ISOChecksumType, + "iso_url": &b.config.RawSingleISOUrl, + "vm_name": &b.config.VMName, } for n, ptr := range templates { @@ -300,7 +296,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe SSHConfig: vboxcommon.SSHConfigFunc(b.config.SSHConfig), SSHWaitTimeout: b.config.SSHWaitTimeout, }, - new(stepUploadVersion), + &vboxcommon.StepUploadVersion{ + Path: b.config.VBoxVersionFile, + }, new(stepUploadGuestAdditions), new(common.StepProvision), &vboxcommon.StepShutdown{ diff --git a/builder/virtualbox/iso/builder_test.go b/builder/virtualbox/iso/builder_test.go index 50d075999..85d3f4d0e 100644 --- a/builder/virtualbox/iso/builder_test.go +++ b/builder/virtualbox/iso/builder_test.go @@ -454,37 +454,3 @@ func TestBuilderPrepare_ISOUrl(t *testing.T) { t.Fatalf("bad: %#v", b.config.ISOUrls) } } - -func TestBuilderPrepare_VBoxVersionFile(t *testing.T) { - var b Builder - config := testConfig() - - // Test empty - delete(config, "virtualbox_version_file") - warns, err := b.Prepare(config) - if len(warns) > 0 { - t.Fatalf("bad: %#v", warns) - } - if err != nil { - t.Fatalf("err: %s", err) - } - - if b.config.VBoxVersionFile != ".vbox_version" { - t.Fatalf("bad value: %s", b.config.VBoxVersionFile) - } - - // Test with a good one - config["virtualbox_version_file"] = "foo" - b = Builder{} - warns, err = b.Prepare(config) - if len(warns) > 0 { - t.Fatalf("bad: %#v", warns) - } - if err != nil { - t.Fatalf("should not have error: %s", err) - } - - if b.config.VBoxVersionFile != "foo" { - t.Fatalf("bad value: %s", b.config.VBoxVersionFile) - } -} diff --git a/builder/virtualbox/ovf/builder.go b/builder/virtualbox/ovf/builder.go index a8cb3b903..cecad072b 100644 --- a/builder/virtualbox/ovf/builder.go +++ b/builder/virtualbox/ovf/builder.go @@ -71,8 +71,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe SSHConfig: vboxcommon.SSHConfigFunc(b.config.SSHConfig), SSHWaitTimeout: b.config.SSHWaitTimeout, }, + &vboxcommon.StepUploadVersion{ + Path: b.config.VBoxVersionFile, + }, /* - new(stepUploadVersion), new(stepUploadGuestAdditions), */ new(common.StepProvision), diff --git a/builder/virtualbox/ovf/config.go b/builder/virtualbox/ovf/config.go index 2c2442bc8..00ee33181 100644 --- a/builder/virtualbox/ovf/config.go +++ b/builder/virtualbox/ovf/config.go @@ -16,6 +16,7 @@ type Config struct { vboxcommon.SSHConfig `mapstructure:",squash"` vboxcommon.ShutdownConfig `mapstructure:",squash"` vboxcommon.VBoxManageConfig `mapstructure:",squash"` + vboxcommon.VBoxVersionConfig `mapstructure:",squash"` tpl *packer.ConfigTemplate } @@ -41,6 +42,7 @@ func NewConfig(raws ...interface{}) (*Config, []string, error) { errs = packer.MultiErrorAppend(errs, c.RunConfig.Prepare(c.tpl)...) errs = packer.MultiErrorAppend(errs, c.SSHConfig.Prepare(c.tpl)...) errs = packer.MultiErrorAppend(errs, c.VBoxManageConfig.Prepare(c.tpl)...) + errs = packer.MultiErrorAppend(errs, c.VBoxVersionConfig.Prepare(c.tpl)...) // Warnings var warnings []string