From 63f9282f5c93543a971e139814a42104c59762f5 Mon Sep 17 00:00:00 2001 From: Joshua Foster Date: Wed, 1 Jul 2020 12:53:56 -0400 Subject: [PATCH 1/3] fix vshere ToolsSyncTime and ToolsUpgradePolicy --- builder/vsphere/common/step_config_params.go | 24 ++++++++++++------- builder/vsphere/driver/vm.go | 22 ++++++++++------- .../ConfigParamsConfig-not-required.mdx | 3 +-- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/builder/vsphere/common/step_config_params.go b/builder/vsphere/common/step_config_params.go index 591f82eee..d13096109 100644 --- a/builder/vsphere/common/step_config_params.go +++ b/builder/vsphere/common/step_config_params.go @@ -7,6 +7,8 @@ import ( "context" "fmt" + "github.com/vmware/govmomi/vim25/types" + "github.com/hashicorp/packer/builder/vsphere/driver" "github.com/hashicorp/packer/helper/multistep" "github.com/hashicorp/packer/packer" @@ -17,8 +19,7 @@ type ConfigParamsConfig struct { // ConfigSpec: https://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.vm.ConfigSpec.html ConfigParams map[string]string `mapstructure:"configuration_parameters"` - // Enables time synchronization with the host. If set to true will set `tools.syncTime` to `TRUE`. - // Defaults to FALSE. + // Enables time synchronization with the host. Defaults to false. ToolsSyncTime bool `mapstructure:"tools_sync_time"` // If sets to true, vSphere will automatically check and upgrade VMware Tools upon a system power cycle. @@ -39,17 +40,22 @@ func (s *StepConfigParams) Run(_ context.Context, state multistep.StateBag) mult configParams = s.Config.ConfigParams } - if s.Config.ToolsSyncTime { - configParams["tools.syncTime"] = "TRUE" - } + var info *types.ToolsConfigInfo + if s.Config.ToolsSyncTime || s.Config.ToolsUpgradePolicy { + info = &types.ToolsConfigInfo{} - if s.Config.ToolsUpgradePolicy { - configParams["tools.upgrade.policy"] = "upgradeAtPowerCycle" + if s.Config.ToolsSyncTime { + info.SyncTimeWithHost = &s.Config.ToolsSyncTime + } + + if s.Config.ToolsUpgradePolicy { + info.ToolsUpgradePolicy = "UpgradeAtPowerCycle" + } } - if len(configParams) > 0 { + if len(configParams) > 0 || info != nil { ui.Say("Adding configuration parameters...") - if err := vm.AddConfigParams(configParams); err != nil { + if err := vm.AddConfigParams(configParams, info); err != nil { state.Put("error", fmt.Errorf("error adding configuration parameters: %v", err)) return multistep.ActionHalt } diff --git a/builder/vsphere/driver/vm.go b/builder/vsphere/driver/vm.go index b62ca984c..423addab0 100644 --- a/builder/vsphere/driver/vm.go +++ b/builder/vsphere/driver/vm.go @@ -800,18 +800,24 @@ func (vm *VirtualMachine) addDevice(device types.BaseVirtualDevice) error { return err } -func (vm *VirtualMachine) AddConfigParams(params map[string]string) error { +func (vm *VirtualMachine) AddConfigParams(params map[string]string, info *types.ToolsConfigInfo) error { var confSpec types.VirtualMachineConfigSpec - var ov []types.BaseOptionValue - for k, v := range params { - o := types.OptionValue{ - Key: k, - Value: v, + if len(params) > 0 { + var ov []types.BaseOptionValue + for k, v := range params { + o := types.OptionValue{ + Key: k, + Value: v, + } + ov = append(ov, &o) } - ov = append(ov, &o) + confSpec.ExtraConfig = ov + } + + if info != nil { + confSpec.Tools = info } - confSpec.ExtraConfig = ov task, err := vm.vm.Reconfigure(vm.driver.ctx, confSpec) if err != nil { diff --git a/website/pages/partials/builder/vsphere/common/ConfigParamsConfig-not-required.mdx b/website/pages/partials/builder/vsphere/common/ConfigParamsConfig-not-required.mdx index 2e76f3082..e80a115b4 100644 --- a/website/pages/partials/builder/vsphere/common/ConfigParamsConfig-not-required.mdx +++ b/website/pages/partials/builder/vsphere/common/ConfigParamsConfig-not-required.mdx @@ -3,8 +3,7 @@ - `configuration_parameters` (map[string]string) - configuration_parameters is a direct passthrough to the VSphere API's ConfigSpec: https://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.vm.ConfigSpec.html -- `tools_sync_time` (bool) - Enables time synchronization with the host. If set to true will set `tools.syncTime` to `TRUE`. - Defaults to FALSE. +- `tools_sync_time` (bool) - Enables time synchronization with the host. Defaults to false. - `tools_upgrade_policy` (bool) - If sets to true, vSphere will automatically check and upgrade VMware Tools upon a system power cycle. If not set, defaults to manual upgrade. From e4dffeed35b1dddf36316353b6b8eb97ecd9bdca Mon Sep 17 00:00:00 2001 From: Joshua Foster Date: Thu, 2 Jul 2020 12:33:28 -0400 Subject: [PATCH 2/3] clean up if logic --- builder/vsphere/common/step_config_params.go | 2 -- builder/vsphere/driver/vm.go | 32 ++++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/builder/vsphere/common/step_config_params.go b/builder/vsphere/common/step_config_params.go index d13096109..140326b24 100644 --- a/builder/vsphere/common/step_config_params.go +++ b/builder/vsphere/common/step_config_params.go @@ -51,9 +51,7 @@ func (s *StepConfigParams) Run(_ context.Context, state multistep.StateBag) mult if s.Config.ToolsUpgradePolicy { info.ToolsUpgradePolicy = "UpgradeAtPowerCycle" } - } - if len(configParams) > 0 || info != nil { ui.Say("Adding configuration parameters...") if err := vm.AddConfigParams(configParams, info); err != nil { state.Put("error", fmt.Errorf("error adding configuration parameters: %v", err)) diff --git a/builder/vsphere/driver/vm.go b/builder/vsphere/driver/vm.go index 423addab0..a282e7b99 100644 --- a/builder/vsphere/driver/vm.go +++ b/builder/vsphere/driver/vm.go @@ -802,29 +802,29 @@ func (vm *VirtualMachine) addDevice(device types.BaseVirtualDevice) error { func (vm *VirtualMachine) AddConfigParams(params map[string]string, info *types.ToolsConfigInfo) error { var confSpec types.VirtualMachineConfigSpec + var err error - if len(params) > 0 { - var ov []types.BaseOptionValue - for k, v := range params { - o := types.OptionValue{ - Key: k, - Value: v, - } - ov = append(ov, &o) + var ov []types.BaseOptionValue + for k, v := range params { + o := types.OptionValue{ + Key: k, + Value: v, } - confSpec.ExtraConfig = ov + ov = append(ov, &o) } + confSpec.ExtraConfig = ov - if info != nil { - confSpec.Tools = info - } + confSpec.Tools = info - task, err := vm.vm.Reconfigure(vm.driver.ctx, confSpec) - if err != nil { - return err + if len(confSpec.ExtraConfig) > 0 || confSpec.Tools != nil { + task, err := vm.vm.Reconfigure(vm.driver.ctx, confSpec) + if err != nil { + return err + } + + _, err = task.WaitForResult(vm.driver.ctx, nil) } - _, err = task.WaitForResult(vm.driver.ctx, nil) return err } From 500ec5ccc7603f2b062c19fa806f4d4a5819a24d Mon Sep 17 00:00:00 2001 From: Joshua Foster Date: Thu, 2 Jul 2020 12:55:10 -0400 Subject: [PATCH 3/3] fix return --- builder/vsphere/driver/vm.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builder/vsphere/driver/vm.go b/builder/vsphere/driver/vm.go index a282e7b99..8d1372282 100644 --- a/builder/vsphere/driver/vm.go +++ b/builder/vsphere/driver/vm.go @@ -802,7 +802,6 @@ func (vm *VirtualMachine) addDevice(device types.BaseVirtualDevice) error { func (vm *VirtualMachine) AddConfigParams(params map[string]string, info *types.ToolsConfigInfo) error { var confSpec types.VirtualMachineConfigSpec - var err error var ov []types.BaseOptionValue for k, v := range params { @@ -823,9 +822,10 @@ func (vm *VirtualMachine) AddConfigParams(params map[string]string, info *types. } _, err = task.WaitForResult(vm.driver.ctx, nil) + return err } - return err + return nil } func (vm *VirtualMachine) Export() (*nfc.Lease, error) {