234 lines
6.4 KiB
Go
234 lines
6.4 KiB
Go
package common
|
|
|
|
import (
|
|
"context"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/hashicorp/packer-plugin-sdk/multistep"
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestStepExport_impl(t *testing.T) {
|
|
var _ multistep.Step = new(StepExport)
|
|
}
|
|
|
|
func stringPointer(s string) *string {
|
|
return &s
|
|
}
|
|
|
|
func remoteExportTestState(t *testing.T) multistep.StateBag {
|
|
state := testState(t)
|
|
driverConfig := &DriverConfig{
|
|
RemoteHost: "123.45.67.8",
|
|
RemotePassword: "password",
|
|
RemoteUser: "user",
|
|
RemoteType: "esx5",
|
|
}
|
|
state.Put("driverConfig", driverConfig)
|
|
state.Put("display_name", "vm_name")
|
|
return state
|
|
}
|
|
|
|
func TestStepExport_ReturnIfSkip(t *testing.T) {
|
|
state := testState(t)
|
|
driverConfig := &DriverConfig{}
|
|
state.Put("driverConfig", driverConfig)
|
|
step := new(StepExport)
|
|
|
|
step.SkipExport = true
|
|
|
|
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
|
t.Fatalf("bad action: %#v", action)
|
|
}
|
|
if _, ok := state.GetOk("error"); ok {
|
|
t.Fatal("should NOT have error")
|
|
}
|
|
|
|
// We told step to skip so it should not have reached the driver's Export
|
|
// func.
|
|
d := state.Get("driver").(*DriverMock)
|
|
if d.ExportCalled {
|
|
t.Fatal("Should not have called the driver export func")
|
|
}
|
|
|
|
// Cleanup
|
|
step.Cleanup(state)
|
|
}
|
|
|
|
func TestStepExport_localArgs(t *testing.T) {
|
|
// even though we aren't overriding the remote args and they are present,
|
|
// test shouldn't use them since remoteType is not set to esx.
|
|
state := testState(t)
|
|
driverConfig := &DriverConfig{}
|
|
state.Put("driverConfig", driverConfig)
|
|
step := new(StepExport)
|
|
|
|
step.SkipExport = false
|
|
step.OutputDir = stringPointer("test-output")
|
|
step.VMName = "test-name"
|
|
step.Format = "ova"
|
|
|
|
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
|
t.Fatalf("bad action: %#v", action)
|
|
}
|
|
if _, ok := state.GetOk("error"); ok {
|
|
t.Fatal("should NOT have error")
|
|
}
|
|
|
|
// Check that step ran, and called Export with the expected args.
|
|
d := state.Get("driver").(*DriverMock)
|
|
if !d.ExportCalled {
|
|
t.Fatal("Should have called the driver export func")
|
|
}
|
|
|
|
assert.Equal(t, d.ExportArgs,
|
|
[]string{
|
|
filepath.Join("test-output", "test-name.vmx"),
|
|
filepath.Join("test-output", "test-name.ova")})
|
|
|
|
// Cleanup
|
|
step.Cleanup(state)
|
|
}
|
|
|
|
func TestStepExport_localArgsExportOutputPath(t *testing.T) {
|
|
// even though we aren't overriding the remote args and they are present,
|
|
// test shouldn't use them since remoteType is not set to esx.
|
|
state := testState(t)
|
|
driverConfig := &DriverConfig{}
|
|
state.Put("driverConfig", driverConfig)
|
|
state.Put("export_output_path", "local_output")
|
|
step := new(StepExport)
|
|
|
|
step.SkipExport = false
|
|
step.OutputDir = stringPointer("test-output")
|
|
step.VMName = "test-name"
|
|
step.Format = "ova"
|
|
|
|
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
|
t.Fatalf("bad action: %#v", action)
|
|
}
|
|
if _, ok := state.GetOk("error"); ok {
|
|
t.Fatal("should NOT have error")
|
|
}
|
|
|
|
// Check that step ran, and called Export with the expected args.
|
|
d := state.Get("driver").(*DriverMock)
|
|
if !d.ExportCalled {
|
|
t.Fatal("Should have called the driver export func")
|
|
}
|
|
|
|
assert.Equal(t, d.ExportArgs,
|
|
[]string{
|
|
filepath.Join("local_output", "test-name.vmx"),
|
|
filepath.Join("local_output", "test-name.ova")})
|
|
|
|
// Cleanup
|
|
step.Cleanup(state)
|
|
}
|
|
|
|
func TestStepExport_localArgs_OvftoolOptions(t *testing.T) {
|
|
// even though we aren't overriding the remote args and they are present,
|
|
// test shouldn't use them since remoteType is not set to esx.
|
|
state := testState(t)
|
|
driverConfig := &DriverConfig{}
|
|
state.Put("driverConfig", driverConfig)
|
|
step := new(StepExport)
|
|
|
|
step.SkipExport = false
|
|
step.OutputDir = stringPointer("test-output")
|
|
step.VMName = "test-name"
|
|
step.Format = "ova"
|
|
step.OVFToolOptions = []string{"--option=value", "--second-option=\"quoted value\""}
|
|
|
|
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
|
t.Fatalf("bad action: %#v", action)
|
|
}
|
|
if _, ok := state.GetOk("error"); ok {
|
|
t.Fatal("should NOT have error")
|
|
}
|
|
|
|
// Check that step ran, and called Export with the expected args.
|
|
d := state.Get("driver").(*DriverMock)
|
|
if !d.ExportCalled {
|
|
t.Fatal("Should have called the driver export func")
|
|
}
|
|
|
|
assert.Equal(t, d.ExportArgs, []string{"--option=value",
|
|
"--second-option=\"quoted value\"",
|
|
filepath.Join("test-output", "test-name.vmx"),
|
|
filepath.Join("test-output", "test-name.ova")})
|
|
|
|
// Cleanup
|
|
step.Cleanup(state)
|
|
}
|
|
|
|
func TestStepExport_RemoteArgs(t *testing.T) {
|
|
// Even though we aren't overriding the remote args and they are present,
|
|
// test shouldn't use them since remoteType is not set to esx.
|
|
state := remoteExportTestState(t)
|
|
step := new(StepExport)
|
|
|
|
step.SkipExport = false
|
|
step.OutputDir = stringPointer("test-output")
|
|
step.VMName = "test-name"
|
|
step.Format = "ova"
|
|
|
|
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
|
t.Fatalf("bad action: %#v", action)
|
|
}
|
|
if _, ok := state.GetOk("error"); ok {
|
|
t.Fatal("should NOT have error")
|
|
}
|
|
|
|
// Check that step ran, and called Export with the expected args.
|
|
d := state.Get("driver").(*DriverMock)
|
|
if !d.ExportCalled {
|
|
t.Fatal("Should have called the driver export func")
|
|
}
|
|
|
|
assert.Equal(t, d.ExportArgs, []string{"--noSSLVerify=true",
|
|
"--skipManifestCheck",
|
|
"-tt=ova",
|
|
"vi://user:password@123.45.67.8/vm_name",
|
|
filepath.Join("test-output", "test-name.ova")})
|
|
|
|
// Cleanup
|
|
step.Cleanup(state)
|
|
}
|
|
|
|
func TestStepExport_RemoteArgsWithExportOutputPath(t *testing.T) {
|
|
// Even though we aren't overriding the remote args and they are present,
|
|
// test shouldn't use them since remoteType is not set to esx.
|
|
state := remoteExportTestState(t)
|
|
state.Put("export_output_path", "local_output")
|
|
step := new(StepExport)
|
|
|
|
step.SkipExport = false
|
|
step.OutputDir = stringPointer("test-output")
|
|
step.VMName = "test-name"
|
|
step.Format = "ova"
|
|
|
|
if action := step.Run(context.Background(), state); action != multistep.ActionContinue {
|
|
t.Fatalf("bad action: %#v", action)
|
|
}
|
|
if _, ok := state.GetOk("error"); ok {
|
|
t.Fatal("should NOT have error")
|
|
}
|
|
|
|
// Check that step ran, and called Export with the expected args.
|
|
d := state.Get("driver").(*DriverMock)
|
|
if !d.ExportCalled {
|
|
t.Fatal("Should have called the driver export func")
|
|
}
|
|
|
|
assert.Equal(t, d.ExportArgs, []string{"--noSSLVerify=true",
|
|
"--skipManifestCheck",
|
|
"-tt=ova",
|
|
"vi://user:password@123.45.67.8/vm_name",
|
|
filepath.Join("local_output", "test-name.ova")})
|
|
|
|
// Cleanup
|
|
step.Cleanup(state)
|
|
}
|