From 21eabf5164c86e562050f482d5012630f83e7efd Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Thu, 22 Aug 2024 20:21:32 +0800 Subject: [PATCH 1/2] 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 c4e3b82906ad83293b22e73ff2eba8888445cb14 Mon Sep 17 00:00:00 2001 From: SevenEarth <391613297@qq.com> Date: Thu, 22 Aug 2024 20:23:39 +0800 Subject: [PATCH 2/2] add --- .changelog/2784.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/2784.txt diff --git a/.changelog/2784.txt b/.changelog/2784.txt new file mode 100644 index 0000000000..d90314eea3 --- /dev/null +++ b/.changelog/2784.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_instance: update destroy function +``` \ No newline at end of file