From 8ae3b2c0e33b9930b8044010aacc67287a5d4fe0 Mon Sep 17 00:00:00 2001 From: Lucas Hahn Date: Fri, 8 Jan 2021 13:42:16 +0100 Subject: [PATCH 1/2] Parameterize all timeouts --- proxmox/virtual_environment_vm.go | 24 +++--- proxmoxtf/resource_virtual_environment_vm.go | 89 ++++++++++++++++---- 2 files changed, 84 insertions(+), 29 deletions(-) diff --git a/proxmox/virtual_environment_vm.go b/proxmox/virtual_environment_vm.go index 3a6d2b17..d5bf7398 100644 --- a/proxmox/virtual_environment_vm.go +++ b/proxmox/virtual_environment_vm.go @@ -24,7 +24,7 @@ var ( ) // CloneVM clones a virtual machine. -func (c *VirtualEnvironmentClient) CloneVM(nodeName string, vmID int, retries int, d *VirtualEnvironmentVMCloneRequestBody) error { +func (c *VirtualEnvironmentClient) CloneVM(nodeName string, vmID int, retries int, d *VirtualEnvironmentVMCloneRequestBody, timeout int) error { resBody := &VirtualEnvironmentVMMoveDiskResponseBody{} var err error @@ -44,7 +44,7 @@ func (c *VirtualEnvironmentClient) CloneVM(nodeName string, vmID int, retries in return errors.New("The server did not include a data object in the response") } - err = c.WaitForNodeTask(nodeName, *resBody.Data, 1800, 5) + err = c.WaitForNodeTask(nodeName, *resBody.Data, timeout, 5) if err == nil { return nil @@ -158,7 +158,7 @@ func (c *VirtualEnvironmentClient) GetVMStatus(nodeName string, vmID int) (*Virt } // MoveVMDisk moves a virtual machine disk. -func (c *VirtualEnvironmentClient) MoveVMDisk(nodeName string, vmID int, d *VirtualEnvironmentVMMoveDiskRequestBody) error { +func (c *VirtualEnvironmentClient) MoveVMDisk(nodeName string, vmID int, d *VirtualEnvironmentVMMoveDiskRequestBody, timeout int) error { taskID, err := c.MoveVMDiskAsync(nodeName, vmID, d) if strings.Contains(err.Error(), "you can't move to the same storage with same format") { @@ -170,7 +170,7 @@ func (c *VirtualEnvironmentClient) MoveVMDisk(nodeName string, vmID int, d *Virt return err } - err = c.WaitForNodeTask(nodeName, *taskID, 86400, 5) + err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5) if err != nil { return err @@ -201,14 +201,14 @@ func (c *VirtualEnvironmentClient) ListVMs() ([]*VirtualEnvironmentVMListRespons } // RebootVM reboots a virtual machine. -func (c *VirtualEnvironmentClient) RebootVM(nodeName string, vmID int, d *VirtualEnvironmentVMRebootRequestBody) error { +func (c *VirtualEnvironmentClient) RebootVM(nodeName string, vmID int, d *VirtualEnvironmentVMRebootRequestBody, timeout int) error { taskID, err := c.RebootVMAsync(nodeName, vmID, d) if err != nil { return err } - err = c.WaitForNodeTask(nodeName, *taskID, 1800, 5) + err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5) if err != nil { return err @@ -249,14 +249,14 @@ func (c *VirtualEnvironmentClient) ResizeVMDisk(nodeName string, vmID int, d *Vi } // ShutdownVM shuts down a virtual machine. -func (c *VirtualEnvironmentClient) ShutdownVM(nodeName string, vmID int, d *VirtualEnvironmentVMShutdownRequestBody) error { +func (c *VirtualEnvironmentClient) ShutdownVM(nodeName string, vmID int, d *VirtualEnvironmentVMShutdownRequestBody, timeout int) error { taskID, err := c.ShutdownVMAsync(nodeName, vmID, d) if err != nil { return err } - err = c.WaitForNodeTask(nodeName, *taskID, 1800, 5) + err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5) if err != nil { return err @@ -282,14 +282,14 @@ func (c *VirtualEnvironmentClient) ShutdownVMAsync(nodeName string, vmID int, d } // StartVM starts a virtual machine. -func (c *VirtualEnvironmentClient) StartVM(nodeName string, vmID int) error { +func (c *VirtualEnvironmentClient) StartVM(nodeName string, vmID int, timeout int) error { taskID, err := c.StartVMAsync(nodeName, vmID) if err != nil { return err } - err = c.WaitForNodeTask(nodeName, *taskID, 1800, 5) + err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5) if err != nil { return err @@ -315,14 +315,14 @@ func (c *VirtualEnvironmentClient) StartVMAsync(nodeName string, vmID int) (*str } // StopVM stops a virtual machine. -func (c *VirtualEnvironmentClient) StopVM(nodeName string, vmID int) error { +func (c *VirtualEnvironmentClient) StopVM(nodeName string, vmID int, timeout int) error { taskID, err := c.StopVMAsync(nodeName, vmID) if err != nil { return err } - err = c.WaitForNodeTask(nodeName, *taskID, 300, 5) + err = c.WaitForNodeTask(nodeName, *taskID, timeout, 5) if err != nil { return err diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index de12d089..453db43a 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -78,6 +78,12 @@ const ( dvResourceVirtualEnvironmentVMStarted = true dvResourceVirtualEnvironmentVMTabletDevice = true dvResourceVirtualEnvironmentVMTemplate = false + dvResourceVirtualEnvironmentVMTimeoutClone = 1800 + dvResourceVirtualEnvironmentVMTimeoutMoveDisk = 1800 + dvResourceVirtualEnvironmentVMTimeoutReboot = 1800 + dvResourceVirtualEnvironmentVMTimeoutShutdownVM = 1800 + dvResourceVirtualEnvironmentVMTimeoutStartVM = 1800 + dvResourceVirtualEnvironmentVMTimeoutStopVM = 300 dvResourceVirtualEnvironmentVMVGAEnabled = true dvResourceVirtualEnvironmentVMVGAMemory = 16 dvResourceVirtualEnvironmentVMVGAType = "std" @@ -173,6 +179,12 @@ const ( mkResourceVirtualEnvironmentVMStarted = "started" mkResourceVirtualEnvironmentVMTabletDevice = "tablet_device" mkResourceVirtualEnvironmentVMTemplate = "template" + mkResourceVirtualEnvironmentVMTimeoutClone = "timeout_clone" + mkResourceVirtualEnvironmentVMTimeoutMoveDisk = "timeout_move_disk" + mkResourceVirtualEnvironmentVMTimeoutReboot = "timeout_reboot" + mkResourceVirtualEnvironmentVMTimeoutShutdownVM = "timeout_shutdown_vm" + mkResourceVirtualEnvironmentVMTimeoutStartVM = "timeout_start_vm" + mkResourceVirtualEnvironmentVMTimeoutStopVM = "timeout_stop_vm" mkResourceVirtualEnvironmentVMVGA = "vga" mkResourceVirtualEnvironmentVMVGAEnabled = "enabled" mkResourceVirtualEnvironmentVMVGAMemory = "memory" @@ -945,6 +957,42 @@ func resourceVirtualEnvironmentVM() *schema.Resource { ForceNew: true, Default: dvResourceVirtualEnvironmentVMTemplate, }, + mkResourceVirtualEnvironmentVMTimeoutClone: { + Type: schema.TypeInt, + Description: "Clone VM timeout", + Optional: true, + Default: dvResourceVirtualEnvironmentVMTimeoutClone, + }, + mkResourceVirtualEnvironmentVMTimeoutMoveDisk: { + Type: schema.TypeInt, + Description: "MoveDisk timeout", + Optional: true, + Default: dvResourceVirtualEnvironmentVMTimeoutMoveDisk, + }, + mkResourceVirtualEnvironmentVMTimeoutReboot: { + Type: schema.TypeInt, + Description: "Reboot timeout", + Optional: true, + Default: dvResourceVirtualEnvironmentVMTimeoutReboot, + }, + mkResourceVirtualEnvironmentVMTimeoutShutdownVM: { + Type: schema.TypeInt, + Description: "Shutdown timeout", + Optional: true, + Default: dvResourceVirtualEnvironmentVMTimeoutShutdownVM, + }, + mkResourceVirtualEnvironmentVMTimeoutStartVM: { + Type: schema.TypeInt, + Description: "Start VM timeout", + Optional: true, + Default: dvResourceVirtualEnvironmentVMTimeoutStartVM, + }, + mkResourceVirtualEnvironmentVMTimeoutStopVM: { + Type: schema.TypeInt, + Description: "Stop VM timeout", + Optional: true, + Default: dvResourceVirtualEnvironmentVMTimeoutStopVM, + }, mkResourceVirtualEnvironmentVMVGA: { Type: schema.TypeList, Description: "The VGA configuration", @@ -1066,12 +1114,14 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface cloneBody.PoolID = &poolID } + cloneTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutClone).(int) + if cloneNodeName != "" && cloneNodeName != nodeName { cloneBody.TargetNodeName = &nodeName - err = veClient.CloneVM(cloneNodeName, cloneVMID, cloneRetries, cloneBody) + err = veClient.CloneVM(cloneNodeName, cloneVMID, cloneRetries, cloneBody, cloneTimeout) } else { - err = veClient.CloneVM(nodeName, cloneVMID, cloneRetries, cloneBody) + err = veClient.CloneVM(nodeName, cloneVMID, cloneRetries, cloneBody, cloneTimeout) } if err != nil { @@ -1414,7 +1464,8 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface } if dataStoreID != "" { - err = veClient.MoveVMDisk(nodeName, vmID, diskMoveBody) + moveDiskTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutMoveDisk).(int) + err = veClient.MoveVMDisk(nodeName, vmID, diskMoveBody, moveDiskTimeout) if err != nil { return err @@ -1860,18 +1911,19 @@ func resourceVirtualEnvironmentVMCreateStart(d *schema.ResourceData, m interface } // Start the virtual machine and wait for it to reach a running state before continuing. - err = veClient.StartVM(nodeName, vmID) + startVMTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutStartVM).(int) + err = veClient.StartVM(nodeName, vmID, startVMTimeout) if err != nil { return err } if reboot { - rebootTimeout := 300 + rebootTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutReboot).(int) err := veClient.RebootVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMRebootRequestBody{ Timeout: &rebootTimeout, - }) + }, (rebootTimeout + 30)) if err != nil { return err @@ -3515,19 +3567,20 @@ func resourceVirtualEnvironmentVMUpdate(d *schema.ResourceData, m interface{}) e if d.HasChange(mkResourceVirtualEnvironmentVMStarted) && !bool(template) { if started { - err = veClient.StartVM(nodeName, vmID) + startVMTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutStartVM).(int) + err = veClient.StartVM(nodeName, vmID, startVMTimeout) if err != nil { return err } } else { forceStop := proxmox.CustomBool(true) - shutdownTimeout := 300 + shutdownTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutShutdownVM).(int) err = veClient.ShutdownVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{ ForceStop: &forceStop, Timeout: &shutdownTimeout, - }) + }, (shutdownTimeout + 30)) if err != nil { return err @@ -3603,12 +3656,12 @@ func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d *schema.ResourceDat if len(diskMoveBodies) > 0 || len(diskResizeBodies) > 0 { if !template { forceStop := proxmox.CustomBool(true) - shutdownTimeout := 300 + shutdownTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutShutdownVM).(int) err = veClient.ShutdownVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{ ForceStop: &forceStop, Timeout: &shutdownTimeout, - }) + }, (shutdownTimeout + 30)) if err != nil { return err @@ -3619,7 +3672,8 @@ func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d *schema.ResourceDat } for _, reqBody := range diskMoveBodies { - err = veClient.MoveVMDisk(nodeName, vmID, reqBody) + moveDiskTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutMoveDisk).(int) + err = veClient.MoveVMDisk(nodeName, vmID, reqBody, moveDiskTimeout) if err != nil { return err @@ -3635,7 +3689,8 @@ func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d *schema.ResourceDat } if (len(diskMoveBodies) > 0 || len(diskResizeBodies) > 0) && started && !template { - err = veClient.StartVM(nodeName, vmID) + startVMTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutStartVM).(int) + err = veClient.StartVM(nodeName, vmID, startVMTimeout) if err != nil { return err @@ -3645,11 +3700,11 @@ func resourceVirtualEnvironmentVMUpdateDiskLocationAndSize(d *schema.ResourceDat // Perform a regular reboot in case it's necessary and haven't already been done. if reboot { - rebootTimeout := 300 + rebootTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutReboot).(int) err := veClient.RebootVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMRebootRequestBody{ Timeout: &rebootTimeout, - }) + }, (rebootTimeout + 30)) if err != nil { return err @@ -3683,12 +3738,12 @@ func resourceVirtualEnvironmentVMDelete(d *schema.ResourceData, m interface{}) e if status.Status != "stopped" { forceStop := proxmox.CustomBool(true) - shutdownTimeout := 300 + shutdownTimeout := d.Get(mkResourceVirtualEnvironmentVMTimeoutShutdownVM).(int) err = veClient.ShutdownVM(nodeName, vmID, &proxmox.VirtualEnvironmentVMShutdownRequestBody{ ForceStop: &forceStop, Timeout: &shutdownTimeout, - }) + }, (shutdownTimeout + 30)) if err != nil { return err From 87e0fe92fbcf5f6aeefa6391cd486851581abdd0 Mon Sep 17 00:00:00 2001 From: Lucas Hahn Date: Fri, 8 Jan 2021 14:29:18 +0100 Subject: [PATCH 2/2] Upadte doc and changelog --- CHANGELOG.md | 1 + docs/resources/vm.md | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4ff501d..207fd821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ ENHANCEMENTS: * resource/virtual_environment_vm: Bulk clones can now use retries as argument to try multiple times to create a clone. * resource/virtual_environment_vm: `on_boot` parameter can be used to start a VM after the Node has been rebooted. * resource/virtual_environment_vm: `reboot` parameter can be used to reboot a VM after creation +* resource/virtual_environment_vm: Has now multiple new parameters to set timeouts for the vm creation/cloning `timeout_clone`, `timeout_move_disk`, `timeout_reboot`, `timeout_shutdown_vm`, `timeout_start_vm`, `timeout_stop_vm` BUG FIXES: diff --git a/docs/resources/vm.md b/docs/resources/vm.md index 7bea83cb..60dee6a2 100644 --- a/docs/resources/vm.md +++ b/docs/resources/vm.md @@ -271,6 +271,12 @@ output "ubuntu_vm_public_key" { * `started` - (Optional) Whether to start the virtual machine (defaults to `true`). * `tablet_device` - (Optional) Whether to enable the USB tablet device (defaults to `true`). * `template` - (Optional) Whether to create a template (defaults to `false`). +* `timeout_clone` - (Optional) Timeout for cloning a VM in seconds (defaults to 1800). +* `timeout_move_disk` - (Optional) Timeout for moving the disk of a VM in seconds (defaults to 1800). +* `timeout_reboot` - (Optional) Timeout for rebooting a VM in seconds (defaults to 1800). +* `timeout_shutdown_vm` - (Optional) Timeout for shutting down a VM in seconds (defaults to 1800). +* `timeout_start_vm` - (Optional) Timeout for starting a VM in seconds (defaults to 1800). +* `timeout_stop_vm` - (Optional) Timeout for stopping a VM in seconds (defaults to 300). * `vga` - (Optional) The VGA configuration. * `enabled` - (Optional) Whether to enable the VGA device (defaults to `true`). * `memory` - (Optional) The VGA memory in megabytes (defaults to `16`).