|
|
|
|
@ -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{"hello<enter>world"}}},
|
|
|
|
|
expectCallMonitorCmd: true,
|
|
|
|
|
expectedKeysSent: "helloretworld",
|
|
|
|
|
expectedAction: multistep.ActionContinue,
|
|
|
|
|
name: "interpolated boot command",
|
|
|
|
|
builderConfig: &Config{BootConfig: bootcommand.BootConfig{BootCommand: []string{"hello<enter>world"}}},
|
|
|
|
|
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
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|