From e11f655d2277ce753170a3aef6e04a11f4d90a5f Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 26 Dec 2013 15:26:09 -0700 Subject: [PATCH] builder/vmware/vmx: run the VMs --- builder/vmware/common/run_config.go | 44 ++++++++++++++++++++++++ builder/vmware/common/run_config_test.go | 36 +++++++++++++++++++ builder/vmware/iso/builder.go | 20 ++--------- builder/vmware/iso/builder_test.go | 40 --------------------- builder/vmware/vmx/builder.go | 9 ++++- builder/vmware/vmx/config.go | 2 ++ 6 files changed, 93 insertions(+), 58 deletions(-) create mode 100644 builder/vmware/common/run_config.go create mode 100644 builder/vmware/common/run_config_test.go diff --git a/builder/vmware/common/run_config.go b/builder/vmware/common/run_config.go new file mode 100644 index 000000000..ce3480e9e --- /dev/null +++ b/builder/vmware/common/run_config.go @@ -0,0 +1,44 @@ +package common + +import ( + "fmt" + "time" + + "github.com/mitchellh/packer/packer" +) + +type RunConfig struct { + Headless bool `mapstructure:"headless"` + RawBootWait string `mapstructure:"boot_wait"` + + BootWait time.Duration `` +} + +func (c *RunConfig) Prepare(t *packer.ConfigTemplate) []error { + if c.RawBootWait == "" { + c.RawBootWait = "10s" + } + + templates := map[string]*string{ + "boot_wait": &c.RawBootWait, + } + + var err error + errs := make([]error, 0) + for n, ptr := range templates { + *ptr, err = t.Process(*ptr, nil) + if err != nil { + errs = append(errs, fmt.Errorf("Error processing %s: %s", n, err)) + } + } + + if c.RawBootWait != "" { + c.BootWait, err = time.ParseDuration(c.RawBootWait) + if err != nil { + errs = append( + errs, fmt.Errorf("Failed parsing boot_wait: %s", err)) + } + } + + return errs +} diff --git a/builder/vmware/common/run_config_test.go b/builder/vmware/common/run_config_test.go new file mode 100644 index 000000000..d94e254f7 --- /dev/null +++ b/builder/vmware/common/run_config_test.go @@ -0,0 +1,36 @@ +package common + +import ( + "testing" +) + +func TestRunConfigPrepare(t *testing.T) { + var c *RunConfig + + // Test a default boot_wait + c = new(RunConfig) + c.RawBootWait = "" + errs := c.Prepare(testConfigTemplate(t)) + if len(errs) > 0 { + t.Fatalf("bad: %#v", errs) + } + if c.RawBootWait != "10s" { + t.Fatalf("bad value: %s", c.RawBootWait) + } + + // Test with a bad boot_wait + c = new(RunConfig) + c.RawBootWait = "this is not good" + errs = c.Prepare(testConfigTemplate(t)) + if len(errs) == 0 { + t.Fatal("should error") + } + + // Test with a good one + c = new(RunConfig) + c.RawBootWait = "5s" + errs = c.Prepare(testConfigTemplate(t)) + if len(errs) > 0 { + t.Fatalf("bad: %#v", errs) + } +} diff --git a/builder/vmware/iso/builder.go b/builder/vmware/iso/builder.go index 63e0649a7..85c691a7a 100644 --- a/builder/vmware/iso/builder.go +++ b/builder/vmware/iso/builder.go @@ -26,6 +26,7 @@ type Builder struct { type config struct { common.PackerConfig `mapstructure:",squash"` vmwcommon.OutputConfig `mapstructure:",squash"` + vmwcommon.RunConfig `mapstructure:",squash"` vmwcommon.SSHConfig `mapstructure:",squash"` vmwcommon.VMXConfig `mapstructure:",squash"` @@ -38,7 +39,6 @@ type config struct { ISOChecksumType string `mapstructure:"iso_checksum_type"` ISOUrls []string `mapstructure:"iso_urls"` VMName string `mapstructure:"vm_name"` - Headless bool `mapstructure:"headless"` HTTPDir string `mapstructure:"http_directory"` HTTPPortMin uint `mapstructure:"http_port_min"` HTTPPortMax uint `mapstructure:"http_port_max"` @@ -58,11 +58,9 @@ type config struct { RemoteUser string `mapstructure:"remote_username"` RemotePassword string `mapstructure:"remote_password"` - RawBootWait string `mapstructure:"boot_wait"` RawSingleISOUrl string `mapstructure:"iso_url"` RawShutdownTimeout string `mapstructure:"shutdown_timeout"` - bootWait time.Duration `` shutdownTimeout time.Duration `` tpl *packer.ConfigTemplate } @@ -83,6 +81,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, b.config.OutputConfig.Prepare(b.config.tpl, &b.config.PackerConfig)...) + 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.VMXConfig.Prepare(b.config.tpl)...) warnings := make([]string, 0) @@ -124,10 +123,6 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { b.config.HTTPPortMax = 9000 } - if b.config.RawBootWait == "" { - b.config.RawBootWait = "10s" - } - if b.config.VNCPortMin == 0 { b.config.VNCPortMin = 5900 } @@ -163,7 +158,6 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { "shutdown_command": &b.config.ShutdownCommand, "tools_upload_flavor": &b.config.ToolsUploadFlavor, "vm_name": &b.config.VMName, - "boot_wait": &b.config.RawBootWait, "shutdown_timeout": &b.config.RawShutdownTimeout, "vmx_template_path": &b.config.VMXTemplatePath, "remote_type": &b.config.RemoteType, @@ -250,14 +244,6 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { } } - if b.config.RawBootWait != "" { - b.config.bootWait, err = time.ParseDuration(b.config.RawBootWait) - if err != nil { - errs = packer.MultiErrorAppend( - errs, fmt.Errorf("Failed parsing boot_wait: %s", err)) - } - } - if b.config.RawShutdownTimeout == "" { b.config.RawShutdownTimeout = "5m" } @@ -365,7 +351,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe &stepConfigureVNC{}, &StepRegister{}, &vmwcommon.StepRun{ - BootWait: b.config.bootWait, + BootWait: b.config.BootWait, DurationBeforeStop: 5 * time.Second, Headless: b.config.Headless, }, diff --git a/builder/vmware/iso/builder_test.go b/builder/vmware/iso/builder_test.go index 46c6cb300..e76632f6e 100644 --- a/builder/vmware/iso/builder_test.go +++ b/builder/vmware/iso/builder_test.go @@ -29,46 +29,6 @@ func TestBuilder_ImplementsBuilder(t *testing.T) { } } -func TestBuilderPrepare_BootWait(t *testing.T) { - var b Builder - config := testConfig() - - // Test a default boot_wait - delete(config, "boot_wait") - 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.RawBootWait != "10s" { - t.Fatalf("bad value: %s", b.config.RawBootWait) - } - - // Test with a bad boot_wait - config["boot_wait"] = "this is not good" - warns, err = b.Prepare(config) - if len(warns) > 0 { - t.Fatalf("bad: %#v", warns) - } - if err == nil { - t.Fatal("should have error") - } - - // Test with a good one - config["boot_wait"] = "5s" - 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) - } -} - func TestBuilderPrepare_ISOChecksum(t *testing.T) { var b Builder config := testConfig() diff --git a/builder/vmware/vmx/builder.go b/builder/vmware/vmx/builder.go index a1e42a886..002699d5f 100644 --- a/builder/vmware/vmx/builder.go +++ b/builder/vmware/vmx/builder.go @@ -3,11 +3,13 @@ package vmx import ( "errors" "fmt" + "log" + "time" + "github.com/mitchellh/multistep" vmwcommon "github.com/mitchellh/packer/builder/vmware/common" "github.com/mitchellh/packer/common" "github.com/mitchellh/packer/packer" - "log" ) // Builder implements packer.Builder and builds the actual VirtualBox @@ -62,6 +64,11 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe CustomData: b.config.VMXData, }, &vmwcommon.StepSuppressMessages{}, + &vmwcommon.StepRun{ + BootWait: b.config.BootWait, + DurationBeforeStop: 5 * time.Second, + Headless: b.config.Headless, + }, } // Run the steps. diff --git a/builder/vmware/vmx/config.go b/builder/vmware/vmx/config.go index 312c6a208..c6a1576b8 100644 --- a/builder/vmware/vmx/config.go +++ b/builder/vmware/vmx/config.go @@ -13,6 +13,7 @@ import ( type Config struct { common.PackerConfig `mapstructure:",squash"` vmwcommon.OutputConfig `mapstructure:",squash"` + vmwcommon.RunConfig `mapstructure:",squash"` vmwcommon.SSHConfig `mapstructure:",squash"` vmwcommon.VMXConfig `mapstructure:",squash"` @@ -43,6 +44,7 @@ func NewConfig(raws ...interface{}) (*Config, []string, error) { // Prepare the errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, c.OutputConfig.Prepare(c.tpl, &c.PackerConfig)...) + errs = packer.MultiErrorAppend(errs, c.RunConfig.Prepare(c.tpl)...) errs = packer.MultiErrorAppend(errs, c.SSHConfig.Prepare(c.tpl)...) errs = packer.MultiErrorAppend(errs, c.VMXConfig.Prepare(c.tpl)...)