2020-03-03 05:17:48 -05:00
|
|
|
package vagrant
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"testing"
|
|
|
|
|
2021-03-09 19:40:49 -05:00
|
|
|
"github.com/hashicorp/packer-plugin-sdk/communicator"
|
2020-12-17 16:29:25 -05:00
|
|
|
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
2020-03-03 05:17:48 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestStepSSHConfig_Impl(t *testing.T) {
|
|
|
|
var raw interface{}
|
|
|
|
raw = new(StepSSHConfig)
|
|
|
|
if _, ok := raw.(multistep.Step); !ok {
|
|
|
|
t.Fatalf("initialize should be a step")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-09 19:40:49 -05:00
|
|
|
func TestPrepStepSSHConfig_sshOverrides(t *testing.T) {
|
|
|
|
type testcase struct {
|
|
|
|
name string
|
|
|
|
inputSSHConfig communicator.SSH
|
|
|
|
expectedSSHConfig communicator.SSH
|
|
|
|
}
|
|
|
|
tcs := []testcase{
|
|
|
|
{
|
|
|
|
// defaults to overriding with the ssh config from vagrant\
|
|
|
|
name: "default",
|
|
|
|
inputSSHConfig: communicator.SSH{},
|
|
|
|
expectedSSHConfig: communicator.SSH{
|
|
|
|
SSHHost: "127.0.0.1",
|
|
|
|
SSHPort: 2222,
|
|
|
|
SSHUsername: "vagrant",
|
|
|
|
SSHPassword: "",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
// respects SSH host and port overrides independent of credential
|
|
|
|
// overrides
|
|
|
|
name: "host_override",
|
|
|
|
inputSSHConfig: communicator.SSH{
|
|
|
|
SSHHost: "123.45.67.8",
|
|
|
|
SSHPort: 1234,
|
|
|
|
},
|
|
|
|
expectedSSHConfig: communicator.SSH{
|
|
|
|
SSHHost: "123.45.67.8",
|
|
|
|
SSHPort: 1234,
|
|
|
|
SSHUsername: "vagrant",
|
|
|
|
SSHPassword: "",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
// respects credential overrides
|
|
|
|
name: "credential_override",
|
|
|
|
inputSSHConfig: communicator.SSH{
|
|
|
|
SSHUsername: "megan",
|
|
|
|
SSHPassword: "SoSecure",
|
|
|
|
},
|
|
|
|
expectedSSHConfig: communicator.SSH{
|
|
|
|
SSHHost: "127.0.0.1",
|
|
|
|
SSHPort: 2222,
|
|
|
|
SSHUsername: "megan",
|
|
|
|
SSHPassword: "SoSecure",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
for _, tc := range tcs {
|
|
|
|
driver := &MockVagrantDriver{}
|
|
|
|
config := &Config{
|
|
|
|
Comm: communicator.Config{
|
|
|
|
SSH: tc.inputSSHConfig,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
state := new(multistep.BasicStateBag)
|
|
|
|
state.Put("driver", driver)
|
|
|
|
state.Put("config", config)
|
|
|
|
|
|
|
|
step := StepSSHConfig{}
|
|
|
|
_ = step.Run(context.Background(), state)
|
|
|
|
|
|
|
|
if config.Comm.SSHHost != tc.expectedSSHConfig.SSHHost {
|
|
|
|
t.Fatalf("unexpected sshconfig host: name: %s, recieved %s", tc.name, config.Comm.SSHHost)
|
|
|
|
}
|
|
|
|
if config.Comm.SSHPort != tc.expectedSSHConfig.SSHPort {
|
|
|
|
t.Fatalf("unexpected sshconfig port: name: %s, recieved %d", tc.name, config.Comm.SSHPort)
|
|
|
|
}
|
|
|
|
if config.Comm.SSHUsername != tc.expectedSSHConfig.SSHUsername {
|
|
|
|
t.Fatalf("unexpected sshconfig SSHUsername: name: %s, recieved %s", tc.name, config.Comm.SSHUsername)
|
|
|
|
}
|
|
|
|
if config.Comm.SSHPassword != tc.expectedSSHConfig.SSHPassword {
|
|
|
|
t.Fatalf("unexpected sshconfig SSHUsername: name: %s, recieved %s", tc.name, config.Comm.SSHPassword)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-03 05:17:48 -05:00
|
|
|
func TestPrepStepSSHConfig_GlobalID(t *testing.T) {
|
|
|
|
driver := &MockVagrantDriver{}
|
|
|
|
config := &Config{}
|
|
|
|
state := new(multistep.BasicStateBag)
|
|
|
|
state.Put("driver", driver)
|
|
|
|
state.Put("config", config)
|
|
|
|
|
|
|
|
step := StepSSHConfig{
|
|
|
|
GlobalID: "adsfadf",
|
|
|
|
}
|
|
|
|
_ = step.Run(context.Background(), state)
|
|
|
|
if driver.GlobalID != "adsfadf" {
|
|
|
|
t.Fatalf("Should have called SSHConfig with GlobalID asdfasdf")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPrepStepSSHConfig_NoGlobalID(t *testing.T) {
|
|
|
|
driver := &MockVagrantDriver{}
|
|
|
|
config := &Config{}
|
|
|
|
state := new(multistep.BasicStateBag)
|
|
|
|
state.Put("driver", driver)
|
|
|
|
state.Put("config", config)
|
|
|
|
|
|
|
|
step := StepSSHConfig{}
|
|
|
|
_ = step.Run(context.Background(), state)
|
|
|
|
if driver.GlobalID != "source" {
|
|
|
|
t.Fatalf("Should have called SSHConfig with GlobalID source")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPrepStepSSHConfig_SpacesInPath(t *testing.T) {
|
|
|
|
driver := &MockVagrantDriver{}
|
|
|
|
driver.ReturnSSHConfig = &VagrantSSHConfig{
|
|
|
|
Hostname: "127.0.0.1",
|
|
|
|
User: "vagrant",
|
|
|
|
Port: "2222",
|
|
|
|
UserKnownHostsFile: "/dev/null",
|
|
|
|
StrictHostKeyChecking: false,
|
|
|
|
PasswordAuthentication: false,
|
|
|
|
IdentityFile: "\"/path with spaces/insecure_private_key\"",
|
|
|
|
IdentitiesOnly: true,
|
|
|
|
LogLevel: "FATAL"}
|
|
|
|
|
|
|
|
config := &Config{}
|
|
|
|
state := new(multistep.BasicStateBag)
|
|
|
|
state.Put("driver", driver)
|
|
|
|
state.Put("config", config)
|
|
|
|
|
|
|
|
step := StepSSHConfig{}
|
|
|
|
_ = step.Run(context.Background(), state)
|
|
|
|
expected := "/path with spaces/insecure_private_key"
|
|
|
|
if config.Comm.SSHPrivateKeyFile != expected {
|
|
|
|
t.Fatalf("Bad config private key. Recieved: %s; expected: %s.", config.Comm.SSHPrivateKeyFile, expected)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestPrepStepSSHConfig_NoSpacesInPath(t *testing.T) {
|
|
|
|
driver := &MockVagrantDriver{}
|
|
|
|
driver.ReturnSSHConfig = &VagrantSSHConfig{
|
|
|
|
Hostname: "127.0.0.1",
|
|
|
|
User: "vagrant",
|
|
|
|
Port: "2222",
|
|
|
|
UserKnownHostsFile: "/dev/null",
|
|
|
|
StrictHostKeyChecking: false,
|
|
|
|
PasswordAuthentication: false,
|
|
|
|
IdentityFile: "/path/without/spaces/insecure_private_key",
|
|
|
|
IdentitiesOnly: true,
|
|
|
|
LogLevel: "FATAL"}
|
|
|
|
|
|
|
|
config := &Config{}
|
|
|
|
state := new(multistep.BasicStateBag)
|
|
|
|
state.Put("driver", driver)
|
|
|
|
state.Put("config", config)
|
|
|
|
|
|
|
|
step := StepSSHConfig{}
|
|
|
|
_ = step.Run(context.Background(), state)
|
|
|
|
expected := "/path/without/spaces/insecure_private_key"
|
|
|
|
if config.Comm.SSHPrivateKeyFile != expected {
|
|
|
|
t.Fatalf("Bad config private key. Recieved: %s; expected: %s.", config.Comm.SSHPrivateKeyFile, expected)
|
|
|
|
}
|
|
|
|
}
|