From 3aefa580dc3bb2e66c41b82bdb77a41447ba1b2e Mon Sep 17 00:00:00 2001 From: Sergey Shubin svs1370 Date: Wed, 28 Apr 2021 17:35:22 +0300 Subject: [PATCH] Implement name update for disk resource --- decort/models_api.go | 5 ++++ decort/resource_disk.go | 62 ++++++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/decort/models_api.go b/decort/models_api.go index ced4e52..f6a2f64 100644 --- a/decort/models_api.go +++ b/decort/models_api.go @@ -499,6 +499,11 @@ type DisksListResp []DiskRecord // const DisksResizeAPI = "/restmachine/cloudapi/disks/resize2" +// +// structures related to /cloudapi/disks/resize +// +const DisksRenameAPI = "/restmachine/cloudapi/disks/rename" + // // structures related to /cloudapi/disks/delete // diff --git a/decort/resource_disk.go b/decort/resource_disk.go index 5675efb..27a0ade 100644 --- a/decort/resource_disk.go +++ b/decort/resource_disk.go @@ -85,37 +85,53 @@ func resourceDiskRead(d *schema.ResourceData, m interface{}) error { } func resourceDiskUpdate(d *schema.ResourceData, m interface{}) error { - // update will only change Disk size and, to keep data safe, will not allow - // shrinking disk. - // Attempt to reduce disk size will throw an error - log.Debugf("resourceDiskUpdate: called for Disk ID / name % d / %s, Account ID %d", - d.Get("disk_id").(int), d.Get("name").(string), d.Get("account_id").(int)) + // Update will only change the following attributes of the disk: + // - Size; to keep data safe, shrinking disk is not allowed. + // - Name + // + // Attempt to change disk type will throw an error and mark disk + // resource as partially updated + log.Debugf("resourceDiskUpdate: called for Disk ID / name %s / %s, Account ID %d", + d.Id(), d.Get("name").(string), d.Get("account_id").(int)) d.Partial(true) + controller := m.(*ControllerCfg) + oldSize, newSize := d.GetChange("size") - if oldSize.(int) > newSize.(int) { - return fmt.Errorf("resourceDiskUpdate: Disk ID %d - shrinking disk size from %d to %d not allowed", - d.Get("disk_id").(int), oldSize.(int), newSize.(int)) - } - - if oldSize.(int) == newSize.(int) { - log.Debugf("resourceDiskUpdate: Disk ID %d - no size change required", d.Get("disk_id").(int)) - // and there is no need to re-read disk specs either - d.Partial(false) - return nil + if oldSize.(int) < newSize.(int) { + log.Debugf("resourceDiskUpdate: resizing disk ID %s - %d GB -> %d GB", + d.Id(), oldSize.(int), newSize.(int)) + sizeParams := &url.Values{} + sizeParams.Add("diskId", d.Id()) + sizeParams.Add("size", fmt.Sprintf("%d", newSize.(int))) + _, err := controller.decortAPICall("POST", DisksResizeAPI, sizeParams) + if err != nil { + return err + } + d.SetPartial("size") + } else if oldSize.(int) > newSize.(int) { + return fmt.Errorf("resourceDiskUpdate: Disk ID %s - reducing disk size is not allowed", d.Id()) } - params := &url.Values{} - params.Add("diskId", d.Id()) - params.Add("size", fmt.Sprintf("%d", newSize.(int))) + oldName, newName := d.GetChange("name") + if oldName.(string) != newName.(string) { + log.Debugf("resourceDiskUpdate: renaming disk ID %d - %s -> %s", + d.Get("disk_id").(int), oldName.(string), newName.(string)) + renameParams := &url.Values{} + renameParams.Add("diskId", d.Id()) + renameParams.Add("name", newName.(string)) + _, err := controller.decortAPICall("POST", DisksRenameAPI, renameParams) + if err != nil { + return err + } + d.SetPartial("name") + } - controller := m.(*ControllerCfg) - _, err := controller.decortAPICall("POST", DisksResizeAPI, params) - if err != nil { - return err + oldType, newType := d.GetChange("type") + if oldType.(string) != newType.(string) { + return fmt.Errorf("resourceDiskUpdate: Disk ID %s - changing type of existing disk not allowed", d.Id()) } - d.SetPartial("size") d.Partial(false)