From d3877e62d38ce4a46a5501999e009318b3bbb416 Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Thu, 22 Aug 2024 20:21:32 +0800 Subject: [PATCH 1/4] add --- .../services/cvm/resource_tc_instance.go | 156 ++++++++++++------ 1 file changed, 110 insertions(+), 46 deletions(-) diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go index 7ba6fb1365..d169cc1ce2 100644 --- a/tencentcloud/services/cvm/resource_tc_instance.go +++ b/tencentcloud/services/cvm/resource_tc_instance.go @@ -1558,20 +1558,20 @@ func resourceTencentCloudInstanceDelete(d *schema.ResourceData, meta interface{} } // prepaid need delete again - if instanceChargeType == CVM_CHARGE_TYPE_PREPAID { - err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - errRet := cvmService.DeleteInstance(ctx, instanceId) - if errRet != nil { - return tccommon.RetryError(errRet) - } - - return nil - }) - - if err != nil { - return err - } - } + //if instanceChargeType == CVM_CHARGE_TYPE_PREPAID { + // err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + // errRet := cvmService.DeleteInstance(ctx, instanceId) + // if errRet != nil { + // return tccommon.RetryError(errRet) + // } + // + // return nil + // }) + // + // if err != nil { + // return err + // } + //} //check recycling notExist := false @@ -1610,6 +1610,101 @@ func resourceTencentCloudInstanceDelete(d *schema.ResourceData, meta interface{} return nil } + if instanceChargeType == CVM_CHARGE_TYPE_PREPAID { + if v, ok := d.GetOk("data_disks"); ok { + dataDisks := v.([]interface{}) + for _, d := range dataDisks { + value := d.(map[string]interface{}) + diskId := value["data_disk_id"].(string) + deleteWithInstance := value["delete_with_instance"].(bool) + if deleteWithInstance { + cbsService := svccbs.NewCbsService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) + err := resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { + diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + if *diskInfo.DiskState != svccbs.CBS_STORAGE_STATUS_ATTACHED { + return resource.RetryableError(fmt.Errorf("cbs storage status is %s", *diskInfo.DiskState)) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s delete cbs failed, reason:%s\n ", logId, err.Error()) + return err + } + + err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + e := cbsService.DetachDisk(ctx, diskId, instanceId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s detach cbs failed, reason:%s\n ", logId, err.Error()) + return err + } + + err = resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { + diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + if *diskInfo.DiskState != svccbs.CBS_STORAGE_STATUS_UNATTACHED { + return resource.RetryableError(fmt.Errorf("cbs storage status is %s", *diskInfo.DiskState)) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s read cbs status failed, reason:%s\n ", logId, err.Error()) + return err + } + + err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + e := cbsService.DeleteDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s delete cbs failed, reason:%s\n ", logId, err.Error()) + return err + } + + err = resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { + diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + if *diskInfo.DiskState != svccbs.CBS_STORAGE_STATUS_TORECYCLE { + return resource.RetryableError(fmt.Errorf("cbs storage status is %s", *diskInfo.DiskState)) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s read cbs status failed, reason:%s\n ", logId, err.Error()) + return err + } + } + } + } + } + if !forceDelete { return nil } @@ -1671,7 +1766,7 @@ func resourceTencentCloudInstanceDelete(d *schema.ResourceData, meta interface{} return tccommon.RetryError(e, tccommon.InternalError) } - if *diskInfo.DiskState != svccbs.CBS_STORAGE_STATUS_UNATTACHED { + if *diskInfo.DiskState != svccbs.CBS_STORAGE_STATUS_TORECYCLE { return resource.RetryableError(fmt.Errorf("cbs storage status is %s", *diskInfo.DiskState)) } @@ -1697,37 +1792,6 @@ func resourceTencentCloudInstanceDelete(d *schema.ResourceData, meta interface{} return err } - err = resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { - diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) - if e != nil { - return tccommon.RetryError(e, tccommon.InternalError) - } - - if *diskInfo.DiskState == svccbs.CBS_STORAGE_STATUS_TORECYCLE { - return resource.RetryableError(fmt.Errorf("cbs storage status is %s", *diskInfo.DiskState)) - } - - return nil - }) - - if err != nil { - log.Printf("[CRITAL]%s read cbs status failed, reason:%s\n ", logId, err.Error()) - return err - } - - err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - e := cbsService.DeleteDiskById(ctx, diskId) - if e != nil { - return tccommon.RetryError(e, tccommon.InternalError) - } - - return nil - }) - - if err != nil { - log.Printf("[CRITAL]%s delete cbs failed, reason:%s\n ", logId, err.Error()) - return err - } err = resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) if e != nil { From 0b3c788be0ef9e47ae7a168c8244fd163b3f796f Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Wed, 28 Aug 2024 19:27:10 +0800 Subject: [PATCH 2/4] add --- .../services/cvm/resource_tc_instance.go | 112 +++++++++++++++++- website/docs/r/instance.html.markdown | 1 + 2 files changed, 110 insertions(+), 3 deletions(-) diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go index d169cc1ce2..75e8e2b288 100644 --- a/tencentcloud/services/cvm/resource_tc_instance.go +++ b/tencentcloud/services/cvm/resource_tc_instance.go @@ -288,6 +288,13 @@ func ResourceTencentCloudInstance() *schema.Resource { ForceNew: true, Description: "Decides whether the disk is deleted with instance(only applied to `CLOUD_BASIC`, `CLOUD_SSD` and `CLOUD_PREMIUM` disk with `POSTPAID_BY_HOUR` instance), default is true.", }, + "delete_with_instance_prepaid": { + Type: schema.TypeBool, + Optional: true, + Default: false, + ForceNew: true, + Description: "Decides whether the disk is deleted with instance(only applied to `CLOUD_BASIC`, `CLOUD_SSD` and `CLOUD_PREMIUM` disk with `PREPAID` instance), default is false.", + }, "encrypt": { Type: schema.TypeBool, Optional: true, @@ -997,7 +1004,12 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{}) } } - for _, disk := range instance.DataDisks { + tmpDataDisks := make([]interface{}, 0, len(instance.DataDisks)) + if v, ok := d.GetOk("data_disks"); ok { + tmpDataDisks = v.([]interface{}) + } + + for index, disk := range instance.DataDisks { dataDisk := make(map[string]interface{}, 5) dataDisk["data_disk_id"] = disk.DiskId if disk.DiskId == nil { @@ -1006,6 +1018,15 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{}) dataDisk["data_disk_size"] = size } + dataDisk["delete_with_instance_prepaid"] = false + if len(tmpDataDisks) == len(instance.DataDisks) { + tmpDataDisk := tmpDataDisks[index].(map[string]interface{}) + if deleteWithInstancePrepaid, ok := tmpDataDisk["delete_with_instance_prepaid"]; ok { + deleteWithInstancePrepaidBool := deleteWithInstancePrepaid.(bool) + dataDisk["delete_with_instance_prepaid"] = deleteWithInstancePrepaidBool + } + } + dataDisk["data_disk_type"] = disk.DiskType dataDisk["data_disk_snapshot_id"] = disk.SnapshotId dataDisk["delete_with_instance"] = disk.DeleteWithInstance @@ -1616,8 +1637,8 @@ func resourceTencentCloudInstanceDelete(d *schema.ResourceData, meta interface{} for _, d := range dataDisks { value := d.(map[string]interface{}) diskId := value["data_disk_id"].(string) - deleteWithInstance := value["delete_with_instance"].(bool) - if deleteWithInstance { + deleteWithInstancePrepaid := value["delete_with_instance_prepaid"].(bool) + if deleteWithInstancePrepaid { cbsService := svccbs.NewCbsService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) err := resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) @@ -1759,6 +1780,91 @@ func resourceTencentCloudInstanceDelete(d *schema.ResourceData, meta interface{} diskId := value["data_disk_id"].(string) deleteWithInstance := value["delete_with_instance"].(bool) if deleteWithInstance { + cbsService := svccbs.NewCbsService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) + err := resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { + diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + if *diskInfo.DiskState != svccbs.CBS_STORAGE_STATUS_UNATTACHED { + return resource.RetryableError(fmt.Errorf("cbs storage status is %s", *diskInfo.DiskState)) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s delete cbs failed, reason:%s\n ", logId, err.Error()) + return err + } + + err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + e := cbsService.DeleteDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s delete cbs failed, reason:%s\n ", logId, err.Error()) + return err + } + + err = resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { + diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + if *diskInfo.DiskState == svccbs.CBS_STORAGE_STATUS_TORECYCLE { + return resource.RetryableError(fmt.Errorf("cbs storage status is %s", *diskInfo.DiskState)) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s read cbs status failed, reason:%s\n ", logId, err.Error()) + return err + } + + err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + e := cbsService.DeleteDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s delete cbs failed, reason:%s\n ", logId, err.Error()) + return err + } + err = resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { + diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) + if e != nil { + return tccommon.RetryError(e, tccommon.InternalError) + } + + if diskInfo != nil { + return resource.RetryableError(fmt.Errorf("cbs storage status is %s", *diskInfo.DiskState)) + } + + return nil + }) + + if err != nil { + log.Printf("[CRITAL]%s read cbs status failed, reason:%s\n ", logId, err.Error()) + return err + } + } + + deleteWithInstancePrepaid := value["delete_with_instance_prepaid"].(bool) + if deleteWithInstancePrepaid { cbsService := svccbs.NewCbsService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) err := resource.Retry(tccommon.ReadRetryTimeout*2, func() *resource.RetryError { diskInfo, e := cbsService.DescribeDiskById(ctx, diskId) diff --git a/website/docs/r/instance.html.markdown b/website/docs/r/instance.html.markdown index 7c1374d89f..9fc943a0d6 100644 --- a/website/docs/r/instance.html.markdown +++ b/website/docs/r/instance.html.markdown @@ -266,6 +266,7 @@ The `data_disks` object supports the following: * `data_disk_type` - (Required, String, ForceNew) Data disk type. For more information about limits on different data disk types, see [Storage Overview](https://intl.cloud.tencent.com/document/product/213/4952). Valid values: LOCAL_BASIC: local disk, LOCAL_SSD: local SSD disk, LOCAL_NVME: local NVME disk, specified in the InstanceType, LOCAL_PRO: local HDD disk, specified in the InstanceType, CLOUD_BASIC: HDD cloud disk, CLOUD_PREMIUM: Premium Cloud Storage, CLOUD_SSD: SSD, CLOUD_HSSD: Enhanced SSD, CLOUD_TSSD: Tremendous SSD, CLOUD_BSSD: Balanced SSD. * `data_disk_id` - (Optional, String) Data disk ID used to initialize the data disk. When data disk type is `LOCAL_BASIC` and `LOCAL_SSD`, disk id is not supported. * `data_disk_snapshot_id` - (Optional, String, ForceNew) Snapshot ID of the data disk. The selected data disk snapshot size must be smaller than the data disk size. +* `delete_with_instance_prepaid` - (Optional, Bool, ForceNew) Decides whether the disk is deleted with instance(only applied to `CLOUD_BASIC`, `CLOUD_SSD` and `CLOUD_PREMIUM` disk with `PREPAID` instance), default is false. * `delete_with_instance` - (Optional, Bool, ForceNew) Decides whether the disk is deleted with instance(only applied to `CLOUD_BASIC`, `CLOUD_SSD` and `CLOUD_PREMIUM` disk with `POSTPAID_BY_HOUR` instance), default is true. * `encrypt` - (Optional, Bool, ForceNew) Decides whether the disk is encrypted. Default is `false`. * `throughput_performance` - (Optional, Int, ForceNew) Add extra performance to the data disk. Only works when disk type is `CLOUD_TSSD` or `CLOUD_HSSD`. From 48c0de0623c6e48c98260e9fffb0b744677a9ee5 Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Wed, 28 Aug 2024 19:30:22 +0800 Subject: [PATCH 3/4] add --- .changelog/2794.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/2794.txt diff --git a/.changelog/2794.txt b/.changelog/2794.txt new file mode 100644 index 0000000000..15fa23391a --- /dev/null +++ b/.changelog/2794.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_instance: support delete perpaid disk. +``` From 3b07b6e4c8b7e31044493c8cf6d9ab19aa2017aa Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Wed, 28 Aug 2024 19:33:11 +0800 Subject: [PATCH 4/4] add --- .changelog/2794.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changelog/2794.txt b/.changelog/2794.txt index 15fa23391a..9eccdff926 100644 --- a/.changelog/2794.txt +++ b/.changelog/2794.txt @@ -1,3 +1,3 @@ ```release-note:enhancement -resource/tencentcloud_instance: support delete perpaid disk. +resource/tencentcloud_instance: support delete prepaid disk. ```