Merge pull request #6984 from hashicorp/add_display_name_vmware

add new display_name template option
This commit is contained in:
Megan Marsh 2018-11-12 08:49:38 -08:00 committed by GitHub
commit 49b40e0789
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 52 additions and 26 deletions

View File

@ -20,9 +20,10 @@ import (
// Produces: // Produces:
// display_name string - Value of the displayName key set in the VMX file // display_name string - Value of the displayName key set in the VMX file
type StepConfigureVMX struct { type StepConfigureVMX struct {
CustomData map[string]string CustomData map[string]string
SkipFloppy bool DisplayName string
VMName string SkipFloppy bool
VMName string
} }
func (s *StepConfigureVMX) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { func (s *StepConfigureVMX) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
@ -73,6 +74,25 @@ func (s *StepConfigureVMX) Run(_ context.Context, state multistep.StateBag) mult
} }
} }
// If the build is taking place on a remote ESX server, the displayName
// will be needed for discovery of the VM's IP address and for export
// of the VM. The displayName key should always be set in the VMX file,
// so error if we don't find it and the user has not set it in the config.
if s.DisplayName != "" {
vmxData["displayname"] = s.DisplayName
state.Put("display_name", s.DisplayName)
} else {
displayName, ok := vmxData["displayname"]
if !ok { // Packer converts key names to lowercase!
err := fmt.Errorf("Error: Could not get value of displayName from VMX data")
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
} else {
state.Put("display_name", displayName)
}
}
err = WriteVMX(vmxPath, vmxData) err = WriteVMX(vmxPath, vmxData)
if err != nil { if err != nil {
@ -82,19 +102,6 @@ func (s *StepConfigureVMX) Run(_ context.Context, state multistep.StateBag) mult
return multistep.ActionHalt return multistep.ActionHalt
} }
// If the build is taking place on a remote ESX server, the displayName
// will be needed for discovery of the VM's IP address and for export
// of the VM. The displayName key should always be set in the VMX file,
// so error if we don't find it
if displayName, ok := vmxData["displayname"]; !ok { // Packer converts key names to lowercase!
err := fmt.Errorf("Error: Could not get value of displayName from VMX data")
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
} else {
state.Put("display_name", displayName)
}
return multistep.ActionContinue return multistep.ActionContinue
} }

View File

@ -8,6 +8,7 @@ type VMXConfig struct {
VMXData map[string]string `mapstructure:"vmx_data"` VMXData map[string]string `mapstructure:"vmx_data"`
VMXDataPost map[string]string `mapstructure:"vmx_data_post"` VMXDataPost map[string]string `mapstructure:"vmx_data_post"`
VMXRemoveEthernet bool `mapstructure:"vmx_remove_ethernet_interfaces"` VMXRemoveEthernet bool `mapstructure:"vmx_remove_ethernet_interfaces"`
VMXDisplayName string `mapstructure:"display_name"`
} }
func (c *VMXConfig) Prepare(ctx *interpolate.Context) []error { func (c *VMXConfig) Prepare(ctx *interpolate.Context) []error {

View File

@ -298,8 +298,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
&stepCreateDisk{}, &stepCreateDisk{},
&stepCreateVMX{}, &stepCreateVMX{},
&vmwcommon.StepConfigureVMX{ &vmwcommon.StepConfigureVMX{
CustomData: b.config.VMXData, CustomData: b.config.VMXData,
VMName: b.config.VMName, VMName: b.config.VMName,
DisplayName: b.config.VMXDisplayName,
}, },
&vmwcommon.StepSuppressMessages{}, &vmwcommon.StepSuppressMessages{},
&common.StepHTTPServer{ &common.StepHTTPServer{
@ -355,9 +356,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Skip: b.config.SkipCompaction, Skip: b.config.SkipCompaction,
}, },
&vmwcommon.StepConfigureVMX{ &vmwcommon.StepConfigureVMX{
CustomData: b.config.VMXDataPost, CustomData: b.config.VMXDataPost,
SkipFloppy: true, SkipFloppy: true,
VMName: b.config.VMName, VMName: b.config.VMName,
DisplayName: b.config.VMXDisplayName,
}, },
&vmwcommon.StepCleanVMX{ &vmwcommon.StepCleanVMX{
RemoveEthernetInterfaces: b.config.VMXConfig.VMXRemoveEthernet, RemoveEthernetInterfaces: b.config.VMXConfig.VMXRemoveEthernet,

View File

@ -88,8 +88,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Linked: b.config.Linked, Linked: b.config.Linked,
}, },
&vmwcommon.StepConfigureVMX{ &vmwcommon.StepConfigureVMX{
CustomData: b.config.VMXData, CustomData: b.config.VMXData,
VMName: b.config.VMName, VMName: b.config.VMName,
DisplayName: b.config.VMXDisplayName,
}, },
&vmwcommon.StepSuppressMessages{}, &vmwcommon.StepSuppressMessages{},
&common.StepHTTPServer{ &common.StepHTTPServer{
@ -148,9 +149,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Skip: b.config.SkipCompaction, Skip: b.config.SkipCompaction,
}, },
&vmwcommon.StepConfigureVMX{ &vmwcommon.StepConfigureVMX{
CustomData: b.config.VMXDataPost, CustomData: b.config.VMXDataPost,
SkipFloppy: true, SkipFloppy: true,
VMName: b.config.VMName, VMName: b.config.VMName,
DisplayName: b.config.VMXDisplayName,
}, },
&vmwcommon.StepCleanVMX{ &vmwcommon.StepCleanVMX{
RemoveEthernetInterfaces: b.config.VMXConfig.VMXRemoveEthernet, RemoveEthernetInterfaces: b.config.VMXConfig.VMXRemoveEthernet,

View File

@ -154,6 +154,13 @@ builder.
Guide](https://www.vmware.com/pdf/VirtualDiskManager.pdf) for desktop Guide](https://www.vmware.com/pdf/VirtualDiskManager.pdf) for desktop
VMware clients. For ESXi, refer to the proper ESXi documentation. VMware clients. For ESXi, refer to the proper ESXi documentation.
- `display_name` (string) - The name that will appear in your vSphere client,
and will be used for the vmx basename. This will override the "displayname"
value in your vmx file. It will also override the "displayname" if you have
set it in the "vmx_data" Packer option. This option is useful if you are
chaining vmx builds and want to make sure that the display name of each step
in the chain is unique.
- `floppy_dirs` (array of strings) - A list of directories to place onto - `floppy_dirs` (array of strings) - A list of directories to place onto
the floppy disk recursively. This is similar to the `floppy_files` option the floppy disk recursively. This is similar to the `floppy_files` option
except that the directory structure is preserved. This is useful for when except that the directory structure is preserved. This is useful for when

View File

@ -77,6 +77,13 @@ builder.
- `disable_vnc` (boolean) - Whether to create a VNC connection or not. - `disable_vnc` (boolean) - Whether to create a VNC connection or not.
A `boot_command` cannot be used when this is `false`. Defaults to `false`. A `boot_command` cannot be used when this is `false`. Defaults to `false`.
- `display_name` (string) - The name that will appear in your vSphere client,
and will be used for the vmx basename. This will override the "displayname"
value in your vmx file. It will also override the "displayname" if you have
set it in the "vmx_data" Packer option. This option is useful if you are
chaining vmx builds and want to make sure that the display name of each step
in the chain is unique.
- `floppy_dirs` (array of strings) - A list of directories to place onto - `floppy_dirs` (array of strings) - A list of directories to place onto
the floppy disk recursively. This is similar to the `floppy_files` option the floppy disk recursively. This is similar to the `floppy_files` option
except that the directory structure is preserved. This is useful for when except that the directory structure is preserved. This is useful for when