From 31d4f8af45e88b233995658097914d48f6e69247 Mon Sep 17 00:00:00 2001 From: Megan Marsh Date: Thu, 23 Aug 2018 13:16:01 -0700 Subject: [PATCH] use a time.Duration instead of a hardcoded ms --- .../hyperv/common/step_type_boot_command.go | 2 +- .../common/step_type_boot_command.go | 2 +- .../common/step_type_boot_command.go | 2 +- builder/virtualbox/iso/builder.go | 5 -- .../vmware/common/step_type_boot_command.go | 2 +- common/bootcommand/config.go | 48 ++++++++++++++----- common/bootcommand/pc_xt_driver.go | 6 +-- common/bootcommand/pc_xt_driver_test.go | 27 +++++++++-- common/bootcommand/vnc_driver.go | 6 +-- common/bootcommand/vnc_driver_test.go | 15 +++++- website/source/docs/builders/qemu.html.md.erb | 4 +- .../docs/builders/virtualbox-iso.html.md.erb | 4 +- .../docs/builders/virtualbox-ovf.html.md.erb | 5 +- .../docs/builders/vmware-iso.html.md.erb | 4 +- .../docs/builders/vmware-vmx.html.md.erb | 4 +- 15 files changed, 89 insertions(+), 47 deletions(-) diff --git a/builder/hyperv/common/step_type_boot_command.go b/builder/hyperv/common/step_type_boot_command.go index 19574243a..dc4b27c85 100644 --- a/builder/hyperv/common/step_type_boot_command.go +++ b/builder/hyperv/common/step_type_boot_command.go @@ -25,7 +25,7 @@ type StepTypeBootCommand struct { BootWait time.Duration SwitchName string Ctx interpolate.Context - GroupInterval int + GroupInterval time.Duration } func (s *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { diff --git a/builder/parallels/common/step_type_boot_command.go b/builder/parallels/common/step_type_boot_command.go index ca3771648..4e1e47b20 100644 --- a/builder/parallels/common/step_type_boot_command.go +++ b/builder/parallels/common/step_type_boot_command.go @@ -26,7 +26,7 @@ type StepTypeBootCommand struct { HostInterfaces []string VMName string Ctx interpolate.Context - GroupInterval int + GroupInterval time.Duration } // Run types the boot command by sending key scancodes into the VM. diff --git a/builder/virtualbox/common/step_type_boot_command.go b/builder/virtualbox/common/step_type_boot_command.go index 95c5219cd..859e425ff 100644 --- a/builder/virtualbox/common/step_type_boot_command.go +++ b/builder/virtualbox/common/step_type_boot_command.go @@ -25,7 +25,7 @@ type StepTypeBootCommand struct { BootWait time.Duration VMName string Ctx interpolate.Context - GroupInterval int + GroupInterval time.Duration } func (s *StepTypeBootCommand) Run(ctx context.Context, state multistep.StateBag) multistep.StepAction { diff --git a/builder/virtualbox/iso/builder.go b/builder/virtualbox/iso/builder.go index b0a9cc5cf..5fe773b52 100644 --- a/builder/virtualbox/iso/builder.go +++ b/builder/virtualbox/iso/builder.go @@ -53,7 +53,6 @@ type Config struct { KeepRegistered bool `mapstructure:"keep_registered"` SkipExport bool `mapstructure:"skip_export"` VMName string `mapstructure:"vm_name"` - KeyInterval int `mapstructure:"key_interval"` ctx interpolate.Context } @@ -122,10 +121,6 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { b.config.ISOInterface = "ide" } - if b.config.KeyInterval == 0 { - b.config.KeyInterval = -1 - } - if b.config.VMName == "" { b.config.VMName = fmt.Sprintf( "packer-%s-%d", b.config.PackerBuildName, interpolate.InitTime.Unix()) diff --git a/builder/vmware/common/step_type_boot_command.go b/builder/vmware/common/step_type_boot_command.go index c1514c272..ac33fd24c 100644 --- a/builder/vmware/common/step_type_boot_command.go +++ b/builder/vmware/common/step_type_boot_command.go @@ -30,7 +30,7 @@ type StepTypeBootCommand struct { BootWait time.Duration VMName string Ctx interpolate.Context - KeyInterval int + KeyInterval time.Duration } type bootCommandTemplateData struct { HTTPIP string diff --git a/common/bootcommand/config.go b/common/bootcommand/config.go index f89d21715..d01e69624 100644 --- a/common/bootcommand/config.go +++ b/common/bootcommand/config.go @@ -9,28 +9,26 @@ import ( ) type BootConfig struct { - RawBootWait string `mapstructure:"boot_wait"` - BootCommand []string `mapstructure:"boot_command"` - // time in ms to wait between each group of 25 key presses - BootGroupInterval int `mapstructure:"boot_keygroup_interval"` - - BootWait time.Duration `` + RawBootGroupInterval string `mapstructure:"boot_keygroup_interval"` + RawBootWait string `mapstructure:"boot_wait"` + BootCommand []string `mapstructure:"boot_command"` + BootGroupInterval time.Duration `` + BootWait time.Duration `` } type VNCConfig struct { BootConfig `mapstructure:",squash"` DisableVNC bool `mapstructure:"disable_vnc"` // time in ms to wait between each key press - BootKeyInterval int `mapstructure:"boot_key_interval"` + RawBootKeyInterval string `mapstructure:"boot_key_interval"` + BootKeyInterval time.Duration `` } func (c *BootConfig) Prepare(ctx *interpolate.Context) (errs []error) { if c.RawBootWait == "" { c.RawBootWait = "10s" } - if c.BootGroupInterval == 0 { - c.BootGroupInterval = -1 - } + if c.RawBootWait != "" { bw, err := time.ParseDuration(c.RawBootWait) if err != nil { @@ -41,6 +39,20 @@ func (c *BootConfig) Prepare(ctx *interpolate.Context) (errs []error) { } } + if c.RawBootGroupInterval == "" { + c.RawBootGroupInterval = "0ms" + } + + if c.RawBootGroupInterval != "" { + bgi, err := time.ParseDuration(c.RawBootGroupInterval) + if err != nil { + errs = append( + errs, fmt.Errorf("Failed parsing boot_keygroup_interval: %s", err)) + } else { + c.BootGroupInterval = bgi + } + } + if c.BootCommand != nil { expSeq, err := GenerateExpressionSequence(c.FlatBootCommand()) if err != nil { @@ -62,9 +74,21 @@ func (c *VNCConfig) Prepare(ctx *interpolate.Context) (errs []error) { errs = append(errs, fmt.Errorf("A boot command cannot be used when vnc is disabled.")) } - if c.BootKeyInterval == 0 { - c.BootKeyInterval = -1 + + if c.RawBootKeyInterval == "" { + c.RawBootKeyInterval = "0ms" } + + if c.RawBootKeyInterval != "" { + bki, err := time.ParseDuration(c.RawBootKeyInterval) + if err != nil { + errs = append( + errs, fmt.Errorf("Failed parsing boot_key_interval: %s", err)) + } else { + c.BootKeyInterval = bki + } + } + errs = append(errs, c.BootConfig.Prepare(ctx)...) return } diff --git a/common/bootcommand/pc_xt_driver.go b/common/bootcommand/pc_xt_driver.go index 11e9cb734..2a3dcb746 100644 --- a/common/bootcommand/pc_xt_driver.go +++ b/common/bootcommand/pc_xt_driver.go @@ -38,7 +38,7 @@ func (sc *scancode) makeBreak() []string { // NewPCXTDriver creates a new boot command driver for VMs that expect PC-XT // keyboard codes. `send` should send its argument to the VM. `chunkSize` should // be the maximum number of keyboard codes to send to `send` at one time. -func NewPCXTDriver(send SendCodeFunc, chunkSize int, interval int) *pcXTDriver { +func NewPCXTDriver(send SendCodeFunc, chunkSize int, interval time.Duration) *pcXTDriver { // We delay (default 100ms) between each input event to allow for CPU or // network latency. See PackerKeyEnv for tuning. keyInterval := common.PackerKeyDefault @@ -46,8 +46,8 @@ func NewPCXTDriver(send SendCodeFunc, chunkSize int, interval int) *pcXTDriver { keyInterval = delay } // Override interval based on builder-specific override - if interval >= 0 { - keyInterval = time.Duration(interval) * time.Millisecond + if interval > time.Duration(0) { + keyInterval = interval } // Scancodes reference: https://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html // https://www.win.tue.nl/~aeb/linux/kbd/scancodes-10.html diff --git a/common/bootcommand/pc_xt_driver_test.go b/common/bootcommand/pc_xt_driver_test.go index f814e64e9..5133f7e85 100644 --- a/common/bootcommand/pc_xt_driver_test.go +++ b/common/bootcommand/pc_xt_driver_test.go @@ -3,6 +3,7 @@ package bootcommand import ( "context" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -79,7 +80,7 @@ func Test_pcxtSpecialOnOff(t *testing.T) { codes = c return nil } - d := NewPCXTDriver(sendCodes, -1, -1) + d := NewPCXTDriver(sendCodes, -1, time.Duration(0)) seq, err := GenerateExpressionSequence(in) assert.NoError(t, err) err = seq.Do(context.Background(), d) @@ -95,7 +96,7 @@ func Test_pcxtSpecial(t *testing.T) { codes = c return nil } - d := NewPCXTDriver(sendCodes, -1, -1) + d := NewPCXTDriver(sendCodes, -1, time.Duration(0)) seq, err := GenerateExpressionSequence(in) assert.NoError(t, err) err = seq.Do(context.Background(), d) @@ -114,10 +115,30 @@ func Test_flushes(t *testing.T) { actual = append(actual, c) return nil } - d := NewPCXTDriver(sendCodes, -1, -1) + d := NewPCXTDriver(sendCodes, -1, time.Duration(0)) seq, err := GenerateExpressionSequence(in) assert.NoError(t, err) err = seq.Do(context.Background(), d) assert.NoError(t, err) assert.Equal(t, expected, actual) } + +func Test_KeyIntervalNotGiven(t *testing.T) { + var codes []string + sendCodes := func(c []string) error { + codes = c + return nil + } + d := NewPCXTDriver(sendCodes, -1, time.Duration(0)) + assert.Equal(t, d.interval, time.Duration(100)*time.Millisecond) +} + +func Test_KeyIntervalGiven(t *testing.T) { + var codes []string + sendCodes := func(c []string) error { + codes = c + return nil + } + d := NewPCXTDriver(sendCodes, -1, time.Duration(5000)*time.Millisecond) + assert.Equal(t, d.interval, time.Duration(5000)*time.Millisecond) +} diff --git a/common/bootcommand/vnc_driver.go b/common/bootcommand/vnc_driver.go index 0983b923e..027bcffca 100644 --- a/common/bootcommand/vnc_driver.go +++ b/common/bootcommand/vnc_driver.go @@ -25,7 +25,7 @@ type vncDriver struct { err error } -func NewVNCDriver(c VNCKeyEvent, interval int) *vncDriver { +func NewVNCDriver(c VNCKeyEvent, interval time.Duration) *vncDriver { // We delay (default 100ms) between each key event to allow for CPU or // network latency. See PackerKeyEnv for tuning. keyInterval := common.PackerKeyDefault @@ -33,8 +33,8 @@ func NewVNCDriver(c VNCKeyEvent, interval int) *vncDriver { keyInterval = delay } // override interval based on builder-specific override. - if interval >= 0 { - keyInterval = time.Duration(interval) * time.Millisecond + if interval > time.Duration(0) { + keyInterval = interval } // Scancodes reference: https://github.com/qemu/qemu/blob/master/ui/vnc_keysym.h diff --git a/common/bootcommand/vnc_driver_test.go b/common/bootcommand/vnc_driver_test.go index d8bd4e71e..75b585fce 100644 --- a/common/bootcommand/vnc_driver_test.go +++ b/common/bootcommand/vnc_driver_test.go @@ -3,6 +3,7 @@ package bootcommand import ( "context" "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -30,10 +31,22 @@ func Test_vncSpecialLookup(t *testing.T) { {0xFFE2, true}, } s := &sender{} - d := NewVNCDriver(s, -1) + d := NewVNCDriver(s, time.Duration(0)) seq, err := GenerateExpressionSequence(in) assert.NoError(t, err) err = seq.Do(context.Background(), d) assert.NoError(t, err) assert.Equal(t, expected, s.e) } + +func Test_vncIntervalNotGiven(t *testing.T) { + s := &sender{} + d := NewVNCDriver(s, time.Duration(0)) + assert.Equal(t, d.interval, time.Duration(100)*time.Millisecond) +} + +func Test_vncIntervalGiven(t *testing.T) { + s := &sender{} + d := NewVNCDriver(s, time.Duration(5000)*time.Millisecond) + assert.Equal(t, d.interval, time.Duration(5000)*time.Millisecond) +} diff --git a/website/source/docs/builders/qemu.html.md.erb b/website/source/docs/builders/qemu.html.md.erb index 25c0d1bbd..962b85c41 100644 --- a/website/source/docs/builders/qemu.html.md.erb +++ b/website/source/docs/builders/qemu.html.md.erb @@ -394,15 +394,13 @@ contention. You can tune this delay on a per-builder basis by specifying "builders": [ { "type": "qemu", - "boot_key_interval": "10" + "boot_key_interval": "10ms" ... } ] } ``` -Note that this option will always be measured in milliseconds. - <%= partial "partials/builders/boot-command" %> Example boot command. This is actually a working boot command used to start an diff --git a/website/source/docs/builders/virtualbox-iso.html.md.erb b/website/source/docs/builders/virtualbox-iso.html.md.erb index 9277f44ac..b97f9eb1c 100644 --- a/website/source/docs/builders/virtualbox-iso.html.md.erb +++ b/website/source/docs/builders/virtualbox-iso.html.md.erb @@ -345,15 +345,13 @@ contention. If you notice missing keys, you can tune this delay by specifying "builders": [ { "type": "virtualbox", - "boot_keygroup_interval": "500" + "boot_keygroup_interval": "500ms" ... } ] } ``` -Note that this option will always be measured in milliseconds. - <%= partial "partials/builders/boot-command" %> Example boot command. This is actually a working boot command used to start an diff --git a/website/source/docs/builders/virtualbox-ovf.html.md.erb b/website/source/docs/builders/virtualbox-ovf.html.md.erb index aa929b823..5981ad8cf 100644 --- a/website/source/docs/builders/virtualbox-ovf.html.md.erb +++ b/website/source/docs/builders/virtualbox-ovf.html.md.erb @@ -308,16 +308,13 @@ contention. If you notice missing keys, you can tune this delay by specifying "builders": [ { "type": "virtualbox", - "boot_keygroup_interval": "500" + "boot_keygroup_interval": "500ms", ... } ] } ``` -Note that this option will always be measured in milliseconds. - - <%= partial "partials/builders/boot-command" %> Example boot command. This is actually a working boot command used to start an diff --git a/website/source/docs/builders/vmware-iso.html.md.erb b/website/source/docs/builders/vmware-iso.html.md.erb index 613dbb4a2..2dcbd36cf 100644 --- a/website/source/docs/builders/vmware-iso.html.md.erb +++ b/website/source/docs/builders/vmware-iso.html.md.erb @@ -447,15 +447,13 @@ contention. You can tune this delay on a per-builder basis by specifying "builders": [ { "type": "vmware-iso", - "boot_key_interval": "10" + "boot_key_interval": "10ms" ... } ] } ``` -Note that this option will always be measured in milliseconds. - <%= partial "partials/builders/boot-command" %> -> **Note**: for the `HTTPIP` to be resolved correctly, your VM's network diff --git a/website/source/docs/builders/vmware-vmx.html.md.erb b/website/source/docs/builders/vmware-vmx.html.md.erb index 78c6c94c1..d597bb98d 100644 --- a/website/source/docs/builders/vmware-vmx.html.md.erb +++ b/website/source/docs/builders/vmware-vmx.html.md.erb @@ -223,15 +223,13 @@ contention. You can tune this delay on a per-builder basis by specifying "builders": [ { "type": "vmware-vmx", - "boot_key_interval": "10" + "boot_key_interval": "10ms" ... } ] } ``` -Note that this option will always be measured in milliseconds. - <%= partial "partials/builders/boot-command" %> Example boot command. This is actually a working boot command used to start an