diff --git a/.changelog/2671.txt b/.changelog/2671.txt new file mode 100644 index 0000000000..994feb8bde --- /dev/null +++ b/.changelog/2671.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_user_info: Support retry +``` \ No newline at end of file diff --git a/tencentcloud/services/cam/data_source_tc_user_info.go b/tencentcloud/services/cam/data_source_tc_user_info.go index 1dc6b614ad..5767bdccf7 100644 --- a/tencentcloud/services/cam/data_source_tc_user_info.go +++ b/tencentcloud/services/cam/data_source_tc_user_info.go @@ -3,6 +3,7 @@ package cam import ( "context" "fmt" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "log" "math/rand" "strconv" @@ -67,9 +68,18 @@ func datasourceTencentCloudUserInfoRead(d *schema.ResourceData, meta interface{} logId = tccommon.GetLogId(ctx) request := cam.NewGetUserAppIdRequest() + response := cam.NewGetUserAppIdResponse() ratelimit.Check(request.GetAction()) - response, err := client.UseCamClient().GetUserAppId(request) + + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := client.UseCamClient().GetUserAppId(request) + if e != nil { + return tccommon.RetryError(e) + } + response = result + return nil + }) if err != nil { log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", @@ -80,25 +90,37 @@ func datasourceTencentCloudUserInfoRead(d *schema.ResourceData, meta interface{} log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) - if err != nil { - return err - } - - result := response.Response - - if result == nil { + if response == nil || response.Response == nil { return fmt.Errorf("get user appid error: empty response") } - - appId := strconv.FormatUint(*result.AppId, 10) - uin := *result.Uin - ownerUin := *result.OwnerUin + var appId, uin, ownerUin string accountInfoRequest := cam.NewDescribeSubAccountsRequest() + accountInfoResponse := cam.NewDescribeSubAccountsResponse() + + if response.Response.AppId != nil { + appId = strconv.FormatUint(*response.Response.AppId, 10) + } + if response.Response.Uin != nil { + uin = *response.Response.Uin + } + if response.Response.OwnerUin != nil { + ownerUin = *response.Response.Uin + } accountInfoRequest.FilterSubAccountUin = []*uint64{helper.Uint64(helper.StrToUInt64(uin))} - accountInfoResponse, err := client.UseCamClient().DescribeSubAccounts(accountInfoRequest) + + err = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + accountInfoResult, e := client.UseCamClient().DescribeSubAccounts(accountInfoRequest) + if e != nil { + return tccommon.RetryError(e) + } + accountInfoResponse = accountInfoResult + return nil + }) if err != nil { + log.Printf("[CRITAL]%s read CAM users failed, reason:%s\n", logId, err.Error()) return err } + subAccounts := accountInfoResponse.Response.SubAccounts var name string if len(subAccounts) > 0 { diff --git a/tencentcloud/services/cam/data_source_tc_user_info_test.go b/tencentcloud/services/cam/data_source_tc_user_info_test.go index 3392348b4b..5efae2b07a 100644 --- a/tencentcloud/services/cam/data_source_tc_user_info_test.go +++ b/tencentcloud/services/cam/data_source_tc_user_info_test.go @@ -14,8 +14,7 @@ func TestAccTencentCloudDataSourceUserInfoBasic(t *testing.T) { Providers: tcacctest.AccProviders, Steps: []resource.TestStep{ { - PreConfig: func() { tcacctest.AccStepPreConfigSetTempAKSK(t, tcacctest.ACCOUNT_TYPE_COMMON) }, - Config: testAccDataUserInfoBasic, + Config: testAccDataUserInfoBasic, Check: resource.ComposeAggregateTestCheckFunc( resource.TestCheckResourceAttrSet("data.tencentcloud_user_info.info", "app_id"), resource.TestCheckResourceAttrSet("data.tencentcloud_user_info.info", "uin"), @@ -33,8 +32,7 @@ func TestAccTencentCloudDataSourceUserInfoSubAccount(t *testing.T) { Steps: []resource.TestStep{ { // Need use subaccount aksk - PreConfig: func() { tcacctest.AccStepPreConfigSetTempAKSK(t, tcacctest.ACCOUNT_TYPE_SUB_ACCOUNT) }, - Config: testAccDataUserInfoSubAccount, + Config: testAccDataUserInfoSubAccount, Check: resource.ComposeAggregateTestCheckFunc( resource.TestCheckResourceAttrSet("data.tencentcloud_user_info.info_sub_account", "app_id"), resource.TestCheckResourceAttrSet("data.tencentcloud_user_info.info_sub_account", "uin"),