From 8acafc0bb7ec0c72619e344d0b6ebc86c805c494 Mon Sep 17 00:00:00 2001 From: Lucas Hahn Date: Mon, 6 Jul 2020 15:48:57 +0200 Subject: [PATCH] Fix Errors - Fix required disk interface parameter - Fix datastore move to same datastore error - Fix compare sizes for resize disk --- proxmox/virtual_environment_vm.go | 5 ++ proxmoxtf/resource_virtual_environment_vm.go | 49 +++++--------------- proxmoxtf/utils.go | 36 ++++++++++++++ 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/proxmox/virtual_environment_vm.go b/proxmox/virtual_environment_vm.go index 9864827f..9a0e7842 100644 --- a/proxmox/virtual_environment_vm.go +++ b/proxmox/virtual_environment_vm.go @@ -161,6 +161,11 @@ func (c *VirtualEnvironmentClient) GetVMStatus(nodeName string, vmID int) (*Virt func (c *VirtualEnvironmentClient) MoveVMDisk(nodeName string, vmID int, d *VirtualEnvironmentVMMoveDiskRequestBody) error { taskID, err := c.MoveVMDiskAsync(nodeName, vmID, d) + if strings.Contains(err.Error(), "you can't move to the same storage with same format") { + // if someone tries to move to the same storage, the move is considered to be successful + return nil + } + if err != nil { return err } diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index ce415a3a..e389d78b 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -8,7 +8,6 @@ import ( "errors" "fmt" "log" - "math" "strconv" "strings" "time" @@ -42,7 +41,7 @@ const ( dvResourceVirtualEnvironmentVMCPUType = "qemu64" dvResourceVirtualEnvironmentVMCPUUnits = 1024 dvResourceVirtualEnvironmentVMDescription = "" - dvResourcevirtualEnvironmentVMDiskInterface = "" + dvResourcevirtualEnvironmentVMDiskInterface = "scsi0" dvResourceVirtualEnvironmentVMDiskDatastoreID = "local-lvm" dvResourceVirtualEnvironmentVMDiskFileFormat = "qcow2" dvResourceVirtualEnvironmentVMDiskFileID = "" @@ -463,8 +462,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource { mkResourcevirtualEnvironmentVMDiskInterface: { Type: schema.TypeString, Description: "The datastore name", - Optional: false, - Default: dvResourcevirtualEnvironmentVMDiskInterface, + Required: true, }, mkResourceVirtualEnvironmentVMDiskDatastoreID: { Type: schema.TypeString, @@ -1345,12 +1343,10 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface return errors.New(fmt.Sprintf("Disk move failed, no disk named %s", diskInterface)) } - compareString := *currentDiskInfo.Size - compareSize := len(compareString) - compareNumber, err := strconv.Atoi(compareString[:compareSize-1]) + compareNumber, err := parseDiskSize(currentDiskInfo.Size) if err != nil { - return errors.New(fmt.Sprintf("Disk resize failed, vm disk size could not be converted to int disk size = %s", *currentDiskInfo.Size)) + return err } if diskSize < compareNumber { @@ -1369,10 +1365,12 @@ func resourceVirtualEnvironmentVMCreateClone(d *schema.ResourceData, m interface Size: fmt.Sprintf("%dG", diskSize), } - err = veClient.MoveVMDisk(nodeName, vmID, diskMoveBody) + if dataStoreID != "" { + err = veClient.MoveVMDisk(nodeName, vmID, diskMoveBody) - if err != nil { - return err + if err != nil { + return err + } } err = veClient.ResizeVMDisk(nodeName, vmID, diskResizeBody) @@ -2487,33 +2485,10 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{ diskSize := 0 var err error + diskSize, err = parseDiskSize(dd.Size) - if dd.Size != nil { - if strings.HasSuffix(*dd.Size, "T") { - diskSize, err = strconv.Atoi(strings.TrimSuffix(*dd.Size, "T")) - - if err != nil { - return err - } - - diskSize = int(math.Ceil(float64(diskSize) * 1024)) - } else if strings.HasSuffix(*dd.Size, "G") { - diskSize, err = strconv.Atoi(strings.TrimSuffix(*dd.Size, "G")) - - if err != nil { - return err - } - } else if strings.HasSuffix(*dd.Size, "M") { - diskSize, err = strconv.Atoi(strings.TrimSuffix(*dd.Size, "M")) - - if err != nil { - return err - } - - diskSize = int(math.Ceil(float64(diskSize) / 1024)) - } else { - return fmt.Errorf("Cannot parse storage size \"%s\"", *dd.Size) - } + if err != nil { + return err } disk[mkResourceVirtualEnvironmentVMDiskSize] = diskSize diff --git a/proxmoxtf/utils.go b/proxmoxtf/utils.go index 0f963ca5..c34f3225 100644 --- a/proxmoxtf/utils.go +++ b/proxmoxtf/utils.go @@ -6,7 +6,10 @@ package proxmoxtf import ( "fmt" + "math" "regexp" + "strconv" + "strings" "testing" "time" "unicode" @@ -445,6 +448,39 @@ func getDiskInfo(data *proxmox.VirtualEnvironmentVMGetResponseData) map[string]* return storageDevices } +func parseDiskSize(size *string) (int, error) { + var diskSize int + var err error + if size != nil { + if strings.HasSuffix(*size, "T") { + diskSize, err = strconv.Atoi(strings.TrimSuffix(*size, "T")) + + if err != nil { + return -1, err + } + + diskSize = int(math.Ceil(float64(diskSize) * 1024)) + } else if strings.HasSuffix(*size, "G") { + diskSize, err = strconv.Atoi(strings.TrimSuffix(*size, "G")) + + if err != nil { + return -1, err + } + } else if strings.HasSuffix(*size, "M") { + diskSize, err = strconv.Atoi(strings.TrimSuffix(*size, "M")) + + if err != nil { + return -1, err + } + + diskSize = int(math.Ceil(float64(diskSize) / 1024)) + } else { + return -1, fmt.Errorf("Cannot parse storage size \"%s\"", *size) + } + } + return diskSize, err +} + func testComputedAttributes(t *testing.T, s *schema.Resource, keys []string) { for _, v := range keys { if s.Schema[v] == nil {