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