diff --git a/builder/proxmox/bootcommand_driver.go b/builder/proxmox/bootcommand_driver.go index 1570845fe..372e34829 100644 --- a/builder/proxmox/bootcommand_driver.go +++ b/builder/proxmox/bootcommand_driver.go @@ -102,13 +102,10 @@ func (p *proxmoxDriver) SendSpecial(special string, action bootcommand.KeyAction } func (p *proxmoxDriver) send(keys string) error { - res, err := p.client.MonitorCmd(p.vmRef, "sendkey "+keys) + err := p.client.Sendkey(p.vmRef, keys) if err != nil { return err } - if data, ok := res["data"].(string); ok && len(data) > 0 { - return fmt.Errorf("failed to send keys: %s", data) - } time.Sleep(p.interval) return nil diff --git a/builder/proxmox/step_type_boot_command.go b/builder/proxmox/step_type_boot_command.go index 04361ee21..97cb70c54 100644 --- a/builder/proxmox/step_type_boot_command.go +++ b/builder/proxmox/step_type_boot_command.go @@ -30,7 +30,7 @@ type bootCommandTemplateData struct { } type commandTyper interface { - MonitorCmd(*proxmox.VmRef, string) (map[string]interface{}, error) + Sendkey(*proxmox.VmRef, string) error } var _ commandTyper = &proxmox.Client{} diff --git a/builder/proxmox/step_type_boot_command_test.go b/builder/proxmox/step_type_boot_command_test.go index 9514ee0c4..c1581a3f8 100644 --- a/builder/proxmox/step_type_boot_command_test.go +++ b/builder/proxmox/step_type_boot_command_test.go @@ -13,75 +13,74 @@ import ( ) type commandTyperMock struct { - monitorCmd func(*proxmox.VmRef, string) (map[string]interface{}, error) + sendkey func(*proxmox.VmRef, string) error } -func (m commandTyperMock) MonitorCmd(ref *proxmox.VmRef, cmd string) (map[string]interface{}, error) { - return m.monitorCmd(ref, cmd) +func (m commandTyperMock) Sendkey(ref *proxmox.VmRef, cmd string) error { + return m.sendkey(ref, cmd) } var _ commandTyper = commandTyperMock{} func TestTypeBootCommand(t *testing.T) { cs := []struct { - name string - builderConfig *Config - expectCallMonitorCmd bool - monitorCmdErr error - monitorCmdRet map[string]interface{} - expectedKeysSent string - expectedAction multistep.StepAction + name string + builderConfig *Config + expectCallSendkey bool + sendkeyErr error + expectedKeysSent string + expectedAction multistep.StepAction }{ { - name: "simple boot command is typed", - builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"hello"}}}, - expectCallMonitorCmd: true, - expectedKeysSent: "hello", - expectedAction: multistep.ActionContinue, + name: "simple boot command is typed", + builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"hello"}}}, + expectCallSendkey: true, + expectedKeysSent: "hello", + expectedAction: multistep.ActionContinue, }, { - name: "interpolated boot command", - builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"helloworld"}}}, - expectCallMonitorCmd: true, - expectedKeysSent: "helloretworld", - expectedAction: multistep.ActionContinue, + name: "interpolated boot command", + builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"helloworld"}}}, + expectCallSendkey: true, + expectedKeysSent: "helloretworld", + expectedAction: multistep.ActionContinue, }, { - name: "merge multiple interpolated boot command", - builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"Hello World 2.0", "foo!bar@baz"}}}, - expectCallMonitorCmd: true, - expectedKeysSent: "shift-hellospcshift-worldspc2dot0fooshift-1barshift-2baz", - expectedAction: multistep.ActionContinue, + name: "merge multiple interpolated boot command", + builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"Hello World 2.0", "foo!bar@baz"}}}, + expectCallSendkey: true, + expectedKeysSent: "shift-hellospcshift-worldspc2dot0fooshift-1barshift-2baz", + expectedAction: multistep.ActionContinue, }, { - name: "without boot command monitorcmd should not be called", - builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{}}}, - expectCallMonitorCmd: false, - expectedAction: multistep.ActionContinue, + name: "without boot command sendkey should not be called", + builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{}}}, + expectCallSendkey: false, + expectedAction: multistep.ActionContinue, }, { - name: "invalid boot command template function", - builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"{{ foo }}"}}}, - expectCallMonitorCmd: false, - expectedAction: multistep.ActionHalt, + name: "invalid boot command template function", + builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"{{ foo }}"}}}, + expectCallSendkey: false, + expectedAction: multistep.ActionHalt, }, { // When proxmox (or Qemu, really) doesn't recognize the keycode we send, we get no error back, but // a map {"data": "invalid parameter: X"}, where X is the keycode. - name: "invalid keys sent to proxmox", - builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"x"}}}, - expectCallMonitorCmd: true, - monitorCmdRet: map[string]interface{}{"data": "invalid parameter: x"}, - expectedKeysSent: "x", - expectedAction: multistep.ActionHalt, + name: "invalid keys sent to proxmox", + builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"x"}}}, + expectCallSendkey: true, + sendkeyErr: fmt.Errorf("invalid parameter: x"), + expectedKeysSent: "x", + expectedAction: multistep.ActionHalt, }, { - name: "error in typing should return halt", - builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"hello"}}}, - expectCallMonitorCmd: true, - monitorCmdErr: fmt.Errorf("some error"), - expectedKeysSent: "h", - expectedAction: multistep.ActionHalt, + name: "error in typing should return halt", + builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"hello"}}}, + expectCallSendkey: true, + sendkeyErr: fmt.Errorf("some error"), + expectedKeysSent: "h", + expectedAction: multistep.ActionHalt, }, } @@ -89,17 +88,14 @@ func TestTypeBootCommand(t *testing.T) { t.Run(c.name, func(t *testing.T) { accumulator := strings.Builder{} typer := commandTyperMock{ - monitorCmd: func(ref *proxmox.VmRef, cmd string) (map[string]interface{}, error) { - if !c.expectCallMonitorCmd { - t.Error("Did not expect MonitorCmd to be called") - } - if !strings.HasPrefix(cmd, "sendkey ") { - t.Errorf("Expected all commands to be sendkey, got %s", cmd) + sendkey: func(ref *proxmox.VmRef, cmd string) error { + if !c.expectCallSendkey { + t.Error("Did not expect sendkey to be called") } - accumulator.WriteString(strings.TrimPrefix(cmd, "sendkey ")) + accumulator.WriteString(cmd) - return c.monitorCmdRet, c.monitorCmdErr + return c.sendkeyErr }, }