Skip to content

Commit 352f592

Browse files
authored
fix: continue read when cvm returns launch failed (#1077)
* fix: continue read when cvm returns launch failed * fix: cvm use tag service to read instance tag * fix: cvm - make cvm errors non retryable
1 parent b12f255 commit 352f592

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

tencentcloud/commom_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,13 +115,15 @@ func TestIsExpectError(t *testing.T) {
115115

116116
err := sdkErrors.NewTencentCloudSDKError("ClientError.NetworkError", "", "")
117117

118+
// Expected
118119
expectedFull := []string{"ClientError.NetworkError"}
119120
expectedShort := []string{"ClientError"}
120-
unExpectedMatchHead := []string{"ClientError.HttpStatusCodeError"}
121-
unExpectedShort := []string{"SystemError"}
122-
123121
assert.Equalf(t, isExpectError(err, expectedFull), true, "")
124122
assert.Equalf(t, isExpectError(err, expectedShort), true, "")
123+
124+
// Unexpected
125+
unExpectedMatchHead := []string{"ClientError.HttpStatusCodeError"}
126+
unExpectedShort := []string{"SystemError"}
125127
assert.Equalf(t, isExpectError(err, unExpectedMatchHead), false, "")
126128
assert.Equalf(t, isExpectError(err, unExpectedShort), false, "")
127129
}

tencentcloud/extension_cvm.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ const (
4949
CVM_IMAGE_LOGIN = "TRUE"
5050
CVM_IMAGE_LOGIN_NOT = "FALSE"
5151

52-
CVM_ZONE_NOT_SUPPORT_ERROR = "InvalidParameterValue.ZoneNotSupported"
52+
// @Deprecated use cvm.INVALIDPARAMETERVALUE_ZONENOTSUPPORTED
53+
CVM_ZONE_NOT_SUPPORT_ERROR = "InvalidParameterValue.ZoneNotSupported"
54+
// @Deprecated use cvm.RESOURCEINSUFFICIENT_CLOUDDISKSOLDOUT instead
5355
CVM_CLOUD_DISK_SOLD_OUT_ERROR = "ResourceInsufficient.CloudDiskSoldOut"
5456

5557
CVM_STOP_MODE_KEEP_CHARGING = "KEEP_CHARGING"
@@ -60,6 +62,13 @@ const (
6062
UNDERLINE = "_"
6163
)
6264

65+
// Only client error can cvm retry, others will directly returns
66+
var CVM_RETRYABLE_ERROR = []string{
67+
// client
68+
"ClientError.NetworkError",
69+
"ClientError.HttpStatusCodeError",
70+
}
71+
6372
var CVM_CHARGE_TYPE = []string{
6473
CVM_CHARGE_TYPE_PREPAID,
6574
CVM_CHARGE_TYPE_POSTPAID,

tencentcloud/resource_tc_instance.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -703,17 +703,18 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{}
703703
}
704704

705705
instanceId := ""
706+
706707
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
707708
ratelimit.Check("create")
708709
response, err := meta.(*TencentCloudClient).apiV3Conn.UseCvmClient().RunInstances(request)
709710
if err != nil {
710711
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
711712
logId, request.GetAction(), request.ToJsonString(), err.Error())
712713
e, ok := err.(*sdkErrors.TencentCloudSDKError)
713-
if ok && e.Code == CVM_CLOUD_DISK_SOLD_OUT_ERROR {
714-
return resource.NonRetryableError(e)
714+
if ok && IsContains(CVM_RETRYABLE_ERROR, e.Code) {
715+
return resource.RetryableError(fmt.Errorf("cvm create error: %s, retrying", e.Error()))
715716
}
716-
return retryError(err)
717+
return resource.NonRetryableError(err)
717718
}
718719
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
719720
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
@@ -852,7 +853,7 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
852853
if err != nil {
853854
return err
854855
}
855-
if instance == nil || *instance.InstanceState == CVM_STATUS_LAUNCH_FAILED {
856+
if instance == nil {
856857
d.SetId("")
857858
return nil
858859
}
@@ -909,9 +910,14 @@ func resourceTencentCloudInstanceRead(d *schema.ResourceData, meta interface{})
909910
_ = d.Set("allocate_public_ip", len(instance.PublicIpAddresses) > 0)
910911
}
911912

913+
tagService := TagService{client}
914+
915+
tags, err := tagService.DescribeResourceTags(ctx, "cvm", "instance", client.Region, d.Id())
916+
if err != nil {
917+
return err
918+
}
912919
// as attachment add tencentcloud:autoscaling:auto-scaling-group-id tag automatically
913920
// we should remove this tag, otherwise it will cause terraform state change
914-
tags := flattenCvmTagsMapping(instance.Tags)
915921
delete(tags, "tencentcloud:autoscaling:auto-scaling-group-id")
916922
_ = d.Set("tags", tags)
917923

0 commit comments

Comments
 (0)