diff --git a/builder/vmware/iso/builder_test.go b/builder/vmware/iso/builder_test.go index cd39df5d3..868eb601a 100644 --- a/builder/vmware/iso/builder_test.go +++ b/builder/vmware/iso/builder_test.go @@ -198,6 +198,123 @@ func TestBuilderPrepare_RemoteType(t *testing.T) { } } +func TestBuilderPrepare_Export(t *testing.T) { + type testCase struct { + InputConfigVals map[string]string + ExpectedSkipExportValue bool + ExpectedFormat string + ExpectedErr bool + Reason string + } + testCases := []testCase{ + { + InputConfigVals: map[string]string{ + "remote_type": "", + "format": "", + }, + ExpectedSkipExportValue: true, + ExpectedFormat: "vmx", + ExpectedErr: false, + Reason: "should have defaulted format to vmx.", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "esx5", + "format": "", + "remote_host": "fakehost.com", + "remote_password": "fakepassword", + "remote_username": "fakeuser", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ovf", + ExpectedErr: false, + Reason: "should have defaulted format to ovf with remote set to esx5.", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "esx5", + "format": "", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ovf", + ExpectedErr: true, + Reason: "should have errored because remote host isn't set for remote build.", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "invalid", + "format": "", + "remote_host": "fakehost.com", + "remote_password": "fakepassword", + "remote_username": "fakeuser", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ovf", + ExpectedErr: true, + Reason: "should error with invalid remote type", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "", + "format": "invalid", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "invalid", + ExpectedErr: true, + Reason: "should error with invalid format", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "", + "format": "ova", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ova", + ExpectedErr: false, + Reason: "should set user-given ova format", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "esx5", + "format": "ova", + "remote_host": "fakehost.com", + "remote_password": "fakepassword", + "remote_username": "fakeuser", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ova", + ExpectedErr: false, + Reason: "should set user-given ova format", + }, + } + for _, tc := range testCases { + config := testConfig() + for k, v := range tc.InputConfigVals { + config[k] = v + } + config["skip_validate_credentials"] = true + outCfg := &Config{} + warns, errs := (outCfg).Prepare(config) + + if len(warns) > 0 { + t.Fatalf("bad: %#v", warns) + } + + if (errs != nil) != tc.ExpectedErr { + t.Fatalf("received error: \n %s \n but 'expected err' was %t", errs, tc.ExpectedErr) + } + + if outCfg.Format != tc.ExpectedFormat { + t.Fatalf("Expected: %s. Actual: %s. Reason: %s", tc.ExpectedFormat, + outCfg.Format, tc.Reason) + } + if outCfg.SkipExport != tc.ExpectedSkipExportValue { + t.Fatalf("For SkipExport expected %t but recieved %t", + tc.ExpectedSkipExportValue, outCfg.SkipExport) + } + } +} + func TestBuilderPrepare_RemoteExport(t *testing.T) { var b Builder config := testConfig() diff --git a/builder/vmware/iso/config.go b/builder/vmware/iso/config.go index 253b578ff..dcb5d0faf 100644 --- a/builder/vmware/iso/config.go +++ b/builder/vmware/iso/config.go @@ -177,14 +177,14 @@ func (c *Config) Prepare(raws ...interface{}) ([]string, error) { } if c.Format == "" { - if c.RemoteType != "esx5" { + if c.RemoteType == "" { c.Format = "vmx" } else { c.Format = "ovf" } } - if c.RemoteType != "esx5" && c.Format == "vmx" { + if c.RemoteType == "" && c.Format == "vmx" { // if we're building locally and want a vmx, there's nothing to export. // Set skip export flag here to keep the export step from attempting // an unneded export diff --git a/builder/vmware/vmx/config.go b/builder/vmware/vmx/config.go index cc7b31531..fc32099e1 100644 --- a/builder/vmware/vmx/config.go +++ b/builder/vmware/vmx/config.go @@ -124,14 +124,14 @@ func (c *Config) Prepare(raws ...interface{}) ([]string, error) { } if c.Format == "" { - if c.RemoteType != "esx5" { + if c.RemoteType == "" { c.Format = "vmx" } else { c.Format = "ovf" } } - if c.RemoteType != "esx5" && c.Format == "vmx" { + if c.RemoteType == "" && c.Format == "vmx" { // if we're building locally and want a vmx, there's nothing to export. // Set skip export flag here to keep the export step from attempting // an unneded export @@ -143,14 +143,6 @@ func (c *Config) Prepare(raws ...interface{}) ([]string, error) { errs = packer.MultiErrorAppend(errs, err) } - if c.Format == "" { - if c.RemoteType != "esx5" { - c.Format = "vmx" - } else { - c.Format = "ovf" - } - } - // Warnings var warnings []string if c.ShutdownCommand == "" { diff --git a/builder/vmware/vmx/config_test.go b/builder/vmware/vmx/config_test.go index 4b5c63483..cd386f4a2 100644 --- a/builder/vmware/vmx/config_test.go +++ b/builder/vmware/vmx/config_test.go @@ -58,3 +58,120 @@ func TestNewConfig_sourcePath(t *testing.T) { warns, errs = (&Config{}).Prepare(cfg) testConfigOk(t, warns, errs) } + +func TestNewConfig_exportConfig(t *testing.T) { + type testCase struct { + InputConfigVals map[string]string + ExpectedSkipExportValue bool + ExpectedFormat string + ExpectedErr bool + Reason string + } + testCases := []testCase{ + { + InputConfigVals: map[string]string{ + "remote_type": "", + "format": "", + }, + ExpectedSkipExportValue: true, + ExpectedFormat: "vmx", + ExpectedErr: false, + Reason: "should have defaulted format to vmx.", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "esx5", + "format": "", + "remote_host": "fakehost.com", + "remote_password": "fakepassword", + "remote_username": "fakeuser", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ovf", + ExpectedErr: false, + Reason: "should have defaulted format to ovf with remote set to esx5.", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "esx5", + "format": "", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ovf", + ExpectedErr: true, + Reason: "should have errored because remote host isn't set for remote build.", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "invalid", + "format": "", + "remote_host": "fakehost.com", + "remote_password": "fakepassword", + "remote_username": "fakeuser", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ovf", + ExpectedErr: true, + Reason: "should error with invalid remote type", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "", + "format": "invalid", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "invalid", + ExpectedErr: true, + Reason: "should error with invalid format", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "", + "format": "ova", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ova", + ExpectedErr: false, + Reason: "should set user-given ova format", + }, + { + InputConfigVals: map[string]string{ + "remote_type": "esx5", + "format": "ova", + "remote_host": "fakehost.com", + "remote_password": "fakepassword", + "remote_username": "fakeuser", + }, + ExpectedSkipExportValue: false, + ExpectedFormat: "ova", + ExpectedErr: false, + Reason: "should set user-given ova format", + }, + } + for _, tc := range testCases { + cfg := testConfig(t) + for k, v := range tc.InputConfigVals { + cfg[k] = v + } + cfg["skip_validate_credentials"] = true + outCfg := &Config{} + warns, errs := (outCfg).Prepare(cfg) + + if len(warns) > 0 { + t.Fatalf("bad: %#v", warns) + } + + if (errs != nil) != tc.ExpectedErr { + t.Fatalf("received error: \n %s \n but 'expected err' was %t", errs, tc.ExpectedErr) + } + + if outCfg.Format != tc.ExpectedFormat { + t.Fatalf("Expected: %s. Actual: %s. Reason: %s", tc.ExpectedFormat, + outCfg.Format, tc.Reason) + } + if outCfg.SkipExport != tc.ExpectedSkipExportValue { + t.Fatalf("For SkipExport expected %t but recieved %t", + tc.ExpectedSkipExportValue, outCfg.SkipExport) + } + } +}