Implement disk management, phase 2
This commit is contained in:
@@ -67,7 +67,8 @@ func flattenDisk(d *schema.ResourceData, disk_facts string) error {
|
|||||||
// d.Set("status", model.Status)
|
// d.Set("status", model.Status)
|
||||||
// d.Set("tech_status", model.TechStatus)
|
// d.Set("tech_status", model.TechStatus)
|
||||||
|
|
||||||
/* we do not manage snapshots via Terraform yet, so keep this commented out for a while
|
/* we do not manage snapshots via Terraform yet (and probably, never will), so
|
||||||
|
// keep this block commented out for a while
|
||||||
if len(model.Snapshots) > 0 {
|
if len(model.Snapshots) > 0 {
|
||||||
log.Debugf("flattenDisk: calling flattenDiskSnapshots")
|
log.Debugf("flattenDisk: calling flattenDiskSnapshots")
|
||||||
if err = d.Set("nics", flattenDiskSnapshots(model.Snapshots)); err != nil {
|
if err = d.Set("nics", flattenDiskSnapshots(model.Snapshots)); err != nil {
|
||||||
|
|||||||
@@ -476,18 +476,26 @@ const ComputeDiskDetachAPI = "/restmachine/cloudapi/compute/diskDetach"
|
|||||||
//
|
//
|
||||||
// structures related to /cloudapi/disks/create
|
// structures related to /cloudapi/disks/create
|
||||||
//
|
//
|
||||||
const DiskCreateAPI = "/restmachine/cloudapi/disks/create"
|
const DisksCreateAPI = "/restmachine/cloudapi/disks/create"
|
||||||
|
|
||||||
//
|
//
|
||||||
// structures related to /cloudapi/disks/get
|
// structures related to /cloudapi/disks/get
|
||||||
//
|
//
|
||||||
const DisksCreateAPI = "/restmachine/cloudapi/disks/create"
|
|
||||||
|
|
||||||
const DisksGetAPI = "/restmachine/cloudapi/disks/get" // Returns single DiskRecord on success
|
const DisksGetAPI = "/restmachine/cloudapi/disks/get" // Returns single DiskRecord on success
|
||||||
|
|
||||||
const DisksListAPI = "/restmachine/cloudapi/disks/list" // Returns list of DiskRecord on success
|
const DisksListAPI = "/restmachine/cloudapi/disks/list" // Returns list of DiskRecord on success
|
||||||
type DisksListResp []DiskRecord
|
type DisksListResp []DiskRecord
|
||||||
|
|
||||||
|
//
|
||||||
|
// structures related to /cloudapi/disks/resize
|
||||||
|
//
|
||||||
|
const DisksResizeAPI = "/restmachine/cloudapi/disks/resize2"
|
||||||
|
|
||||||
|
//
|
||||||
|
// structures related to /cloudapi/disks/delete
|
||||||
|
//
|
||||||
|
const DisksDeleteAPI = "/restmachine/cloudapi/disks/delete"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Grid ID structures
|
// Grid ID structures
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ func resourceComputeDelete(d *schema.ResourceData, m interface{}) error {
|
|||||||
params.Add("permanently", "true")
|
params.Add("permanently", "true")
|
||||||
|
|
||||||
controller := m.(*ControllerCfg)
|
controller := m.(*ControllerCfg)
|
||||||
compFacts, err = controller.decortAPICall("POST", ComputeDeleteAPI, params)
|
_, err = controller.decortAPICall("POST", ComputeDeleteAPI, params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ func resourceDiskCreate(d *schema.ResourceData, m interface{}) error {
|
|||||||
urlValues.Add("decs", argVal.(string))
|
urlValues.Add("decs", argVal.(string))
|
||||||
}
|
}
|
||||||
|
|
||||||
apiResp, err := controller.decortAPICall("POST", DiskCreateAPI, urlValues)
|
apiResp, err := controller.decortAPICall("POST", DisksCreateAPI, urlValues)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ func resourceDiskCreate(d *schema.ResourceData, m interface{}) error {
|
|||||||
d.SetId(apiResp) // update ID of the resource to tell Terraform that the disk resource exists
|
d.SetId(apiResp) // update ID of the resource to tell Terraform that the disk resource exists
|
||||||
diskId, _ := strconv.Atoi(apiResp)
|
diskId, _ := strconv.Atoi(apiResp)
|
||||||
|
|
||||||
log.Debugf("resourceDiskCreate: new Disk ID %d, name %q creation sequence complete", diskId, d.Get("name").(string))
|
log.Debugf("resourceDiskCreate: new Disk ID / name %d / %s creation sequence complete", diskId, d.Get("name").(string))
|
||||||
|
|
||||||
// We may reuse dataSourceDiskRead here as we maintain similarity
|
// We may reuse dataSourceDiskRead here as we maintain similarity
|
||||||
// between Disk resource and Disk data source schemas
|
// between Disk resource and Disk data source schemas
|
||||||
@@ -73,22 +73,45 @@ func resourceDiskCreate(d *schema.ResourceData, m interface{}) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func resourceDiskRead(d *schema.ResourceData, m interface{}) error {
|
func resourceDiskRead(d *schema.ResourceData, m interface{}) error {
|
||||||
disk_facts, err := utilityDiskCheckPresence(d, m)
|
diskFacts, err := utilityDiskCheckPresence(d, m)
|
||||||
if disk_facts == "" {
|
if diskFacts == "" {
|
||||||
// if empty string is returned from utilityDiskCheckPresence then there is no
|
// if empty string is returned from utilityDiskCheckPresence then there is no
|
||||||
// such Disk and err tells so - just return it to the calling party
|
// such Disk and err tells so - just return it to the calling party
|
||||||
d.SetId("") // ensure ID is empty
|
d.SetId("") // ensure ID is empty
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return flattenDisk(d, disk_facts)
|
return flattenDisk(d, diskFacts)
|
||||||
}
|
}
|
||||||
|
|
||||||
func resourceDiskUpdate(d *schema.ResourceData, m interface{}) error {
|
func resourceDiskUpdate(d *schema.ResourceData, m interface{}) error {
|
||||||
log.Debugf("resourceDiskUpdate: called for disk name %q, Account ID %d",
|
// update will only change Disk size and, to keep data safe, will not allow
|
||||||
d.Get("name").(string), d.Get("account_id").(int))
|
// 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))
|
||||||
|
|
||||||
log.Warn("resourceDiskUpdate: NOT IMPLEMENTED YET!")
|
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
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
params := &url.Values{}
|
||||||
|
params.Add("diskId", d.Id())
|
||||||
|
params.Add("size", fmt.Sprintf("%d", newSize.(int)))
|
||||||
|
|
||||||
|
controller := m.(*ControllerCfg)
|
||||||
|
_, err := controller.decortAPICall("POST", DisksResizeAPI, params)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// we may reuse dataSourceDiskRead here as we maintain similarity
|
// we may reuse dataSourceDiskRead here as we maintain similarity
|
||||||
// between Compute resource and Compute data source schemas
|
// between Compute resource and Compute data source schemas
|
||||||
@@ -96,14 +119,38 @@ func resourceDiskUpdate(d *schema.ResourceData, m interface{}) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func resourceDiskDelete(d *schema.ResourceData, m interface{}) error {
|
func resourceDiskDelete(d *schema.ResourceData, m interface{}) error {
|
||||||
log.Warn("resourceDiskDelete: NOT IMPLEMENTED YET!")
|
// NOTE: this function tries to destroy target Disk "permanently", so
|
||||||
|
// there is no way to restore it.
|
||||||
|
// If, however, the disk is attached to a compute, the method will
|
||||||
|
// fail (by failing the underpinning DECORt API call, which is issued with detach=false)
|
||||||
|
log.Debugf("resourceDiskDelete: called for Disk ID / name %d / %s, Account ID %d",
|
||||||
|
d.Get("disk_id").(int), d.Get("name").(string), d.Get("account_id").(int))
|
||||||
|
|
||||||
|
diskFacts, err := utilityDiskCheckPresence(d, m)
|
||||||
|
if diskFacts == "" {
|
||||||
|
// the specified Disk does not exist - in this case according to Terraform best practice
|
||||||
|
// we exit from Destroy method without error
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
params := &url.Values{}
|
||||||
|
params.Add("diskId", d.Id())
|
||||||
|
params.Add("detach", "false")
|
||||||
|
params.Add("permanently", "true")
|
||||||
|
|
||||||
|
controller := m.(*ControllerCfg)
|
||||||
|
_, err = controller.decortAPICall("POST", DisksDeleteAPI, params)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func resourceDiskExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
func resourceDiskExists(d *schema.ResourceData, m interface{}) (bool, error) {
|
||||||
// Reminder: according to Terraform rules, this function should not modify its ResourceData argument
|
// Reminder: according to Terraform rules, this function should not modify its ResourceData argument
|
||||||
log.Debugf("resourceDiskExists: called for Disk name %q, Account ID %d",
|
log.Debugf("resourceDiskExists: called for Disk ID / name %d / %s, Account ID %d",
|
||||||
d.Get("name").(string), d.Get("account_id").(int))
|
d.Get("disk_id").(int), d.Get("name").(string), d.Get("account_id").(int))
|
||||||
|
|
||||||
diskFacts, err := utilityDiskCheckPresence(d, m)
|
diskFacts, err := utilityDiskCheckPresence(d, m)
|
||||||
if diskFacts == "" {
|
if diskFacts == "" {
|
||||||
|
|||||||
Reference in New Issue
Block a user