From aa852e3a21b5113db223ad73d19478486995f7c0 Mon Sep 17 00:00:00 2001 From: mikatong Date: Wed, 8 Jan 2025 16:57:45 +0800 Subject: [PATCH 1/5] fix identity-center-role-assignment --- ...urce_tc_identity_center_role_assignment.go | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go b/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go index 9178a460fd..6254004161 100644 --- a/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go +++ b/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go @@ -164,6 +164,19 @@ func resourceTencentCloudIdentityCenterRoleAssignmentCreate(d *schema.ResourceDa if len(response.Response.Tasks) > 0 { task := response.Response.Tasks[0] + if task == nil { + return fmt.Errorf("task is nil") + } + if task.Status != nil && *task.Status == "Failed" { + if task.FailureReason != nil { + return fmt.Errorf("CreateRoleAssignment failed, failure reason:%s", *task.FailureReason) + } + return fmt.Errorf("CreateRoleAssignment failed") + } + + if task.TaskId == nil { + return fmt.Errorf("task id is nil") + } taskId := *task.TaskId roleConfigurationId := *task.RoleConfigurationId conf := tccommon.BuildStateChangeConf([]string{}, []string{"Success"}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, taskId, []string{})) @@ -292,8 +305,21 @@ func resourceTencentCloudIdentityCenterRoleAssignmentDelete(d *schema.ResourceDa return err } - if deleteRoleAssignmentResponse.Response != nil && deleteRoleAssignmentResponse.Response.Task != nil && deleteRoleAssignmentResponse.Response.Task.TaskId != nil { - conf := tccommon.BuildStateChangeConf([]string{}, []string{"Success"}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, *deleteRoleAssignmentResponse.Response.Task.TaskId, []string{})) + if deleteRoleAssignmentResponse == nil || deleteRoleAssignmentResponse.Response == nil { + return fmt.Errorf("delete role assignment response is nil") + } + if deleteRoleAssignmentResponse.Response.Task == nil { + return fmt.Errorf("delete role assignment task is nil") + } + task := deleteRoleAssignmentResponse.Response.Task + if task.Status != nil && *task.Status == "Failed" { + if task.FailureReason != nil { + return fmt.Errorf("DeleteRoleAssignment failed, failure reason:%s", *task.FailureReason) + } + return fmt.Errorf("DeleteRoleAssignment failed") + } + if task.TaskId != nil { + conf := tccommon.BuildStateChangeConf([]string{}, []string{"Success"}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, *task.TaskId, []string{})) if _, e := conf.WaitForState(); e != nil { return e } From b674c419547aee846a421dfd82095a2fe5bb611d Mon Sep 17 00:00:00 2001 From: mikatong Date: Wed, 8 Jan 2025 17:04:11 +0800 Subject: [PATCH 2/5] add changelog --- .changelog/3064.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changelog/3064.txt diff --git a/.changelog/3064.txt b/.changelog/3064.txt new file mode 100644 index 0000000000..9a9161fd62 --- /dev/null +++ b/.changelog/3064.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_identity_center_role_assignment: process failed task status +``` From 12359b8be60b9cac3253f3a2e31e92566c67a907 Mon Sep 17 00:00:00 2001 From: mikatong Date: Wed, 8 Jan 2025 18:49:01 +0800 Subject: [PATCH 3/5] add retry --- ...esource_tc_identity_center_role_assignment.go | 16 ++++++++++++---- .../tco/service_tencentcloud_organization.go | 11 +++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go b/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go index 6254004161..c56e9334be 100644 --- a/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go +++ b/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go @@ -201,18 +201,26 @@ func resourceTencentCloudIdentityCenterRoleAssignmentRead(d *schema.ResourceData service := OrganizationService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - respData, err := service.DescribeIdentityCenterRoleAssignmentById(ctx, d.Id()) + var roleAssignmentsResponseParams *organization.ListRoleAssignmentsResponseParams + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := service.DescribeIdentityCenterRoleAssignmentById(ctx, d.Id()) + if e != nil { + return tccommon.RetryError(e) + } + roleAssignmentsResponseParams = result + return nil + }) if err != nil { return err } - if respData == nil { + if roleAssignmentsResponseParams == nil { d.SetId("") log.Printf("[WARN]%s resource `identity_center_role_assignment` [%s] not found, please check if it has been deleted.\n", logId, d.Id()) return nil } - if len(respData.RoleAssignments) > 0 { - roleAssignment := respData.RoleAssignments[0] + if len(roleAssignmentsResponseParams.RoleAssignments) > 0 { + roleAssignment := roleAssignmentsResponseParams.RoleAssignments[0] if roleAssignment.RoleConfigurationId != nil { _ = d.Set("role_configuration_id", roleAssignment.RoleConfigurationId) } diff --git a/tencentcloud/services/tco/service_tencentcloud_organization.go b/tencentcloud/services/tco/service_tencentcloud_organization.go index 489f7b52a7..3812e0a486 100644 --- a/tencentcloud/services/tco/service_tencentcloud_organization.go +++ b/tencentcloud/services/tco/service_tencentcloud_organization.go @@ -1613,8 +1613,15 @@ func (me *OrganizationService) AssignmentTaskStatusStateRefreshFunc(zoneId, task return func() (interface{}, string, error) { ctx := tccommon.ContextNil - object, err := me.GetAssignmentTaskStatus(ctx, zoneId, taskId) - + var object *organization.TaskStatus + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := me.GetAssignmentTaskStatus(ctx, zoneId, taskId) + if e != nil { + return tccommon.RetryError(e) + } + object = result + return nil + }) if err != nil { return nil, "", err } From 802bc6cc04095b9bde4d00a409fffd1408e11e16 Mon Sep 17 00:00:00 2001 From: mikatong Date: Wed, 8 Jan 2025 19:24:55 +0800 Subject: [PATCH 4/5] update --- tencentcloud/services/tco/extension_tco.go | 3 +++ .../tco/resource_tc_identity_center_role_assignment.go | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tencentcloud/services/tco/extension_tco.go b/tencentcloud/services/tco/extension_tco.go index 305d9b287b..ed59991987 100644 --- a/tencentcloud/services/tco/extension_tco.go +++ b/tencentcloud/services/tco/extension_tco.go @@ -14,4 +14,7 @@ const ( DescribeTargetTypeNode = "Node" DescribeTargetTypeMember = "User" + + TASK_STATUS_SUCCESS = "Success" + TASK_STATUS_FAILED = "Failed" ) diff --git a/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go b/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go index c56e9334be..62b8f6c0a6 100644 --- a/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go +++ b/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go @@ -167,7 +167,7 @@ func resourceTencentCloudIdentityCenterRoleAssignmentCreate(d *schema.ResourceDa if task == nil { return fmt.Errorf("task is nil") } - if task.Status != nil && *task.Status == "Failed" { + if task.Status != nil && *task.Status == TASK_STATUS_FAILED { if task.FailureReason != nil { return fmt.Errorf("CreateRoleAssignment failed, failure reason:%s", *task.FailureReason) } @@ -179,7 +179,7 @@ func resourceTencentCloudIdentityCenterRoleAssignmentCreate(d *schema.ResourceDa } taskId := *task.TaskId roleConfigurationId := *task.RoleConfigurationId - conf := tccommon.BuildStateChangeConf([]string{}, []string{"Success"}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, taskId, []string{})) + conf := tccommon.BuildStateChangeConf([]string{}, []string{TASK_STATUS_SUCCESS, TASK_STATUS_FAILED}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, taskId, []string{})) if _, e := conf.WaitForState(); e != nil { return e } @@ -320,7 +320,7 @@ func resourceTencentCloudIdentityCenterRoleAssignmentDelete(d *schema.ResourceDa return fmt.Errorf("delete role assignment task is nil") } task := deleteRoleAssignmentResponse.Response.Task - if task.Status != nil && *task.Status == "Failed" { + if task.Status != nil && *task.Status == TASK_STATUS_FAILED { if task.FailureReason != nil { return fmt.Errorf("DeleteRoleAssignment failed, failure reason:%s", *task.FailureReason) } @@ -353,7 +353,7 @@ func resourceTencentCloudIdentityCenterRoleAssignmentDelete(d *schema.ResourceDa } if dismantleRoleConfigurationResponse.Response != nil && dismantleRoleConfigurationResponse.Response.Task != nil && dismantleRoleConfigurationResponse.Response.Task.TaskId != nil { - conf := tccommon.BuildStateChangeConf([]string{}, []string{"Success"}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, *dismantleRoleConfigurationResponse.Response.Task.TaskId, []string{})) + conf := tccommon.BuildStateChangeConf([]string{}, []string{TASK_STATUS_SUCCESS, TASK_STATUS_FAILED}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, *dismantleRoleConfigurationResponse.Response.Task.TaskId, []string{})) if _, e := conf.WaitForState(); e != nil { return e } From e2033481d472d7add6b7d11e0834c04886e1aa6b Mon Sep 17 00:00:00 2001 From: mikatong Date: Thu, 9 Jan 2025 15:20:17 +0800 Subject: [PATCH 5/5] update --- ...urce_tc_identity_center_role_assignment.go | 57 ++++++++++++++----- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go b/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go index 62b8f6c0a6..29537dae0a 100644 --- a/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go +++ b/tencentcloud/services/tco/resource_tc_identity_center_role_assignment.go @@ -169,19 +169,24 @@ func resourceTencentCloudIdentityCenterRoleAssignmentCreate(d *schema.ResourceDa } if task.Status != nil && *task.Status == TASK_STATUS_FAILED { if task.FailureReason != nil { - return fmt.Errorf("CreateRoleAssignment failed, failure reason:%s", *task.FailureReason) + return fmt.Errorf("create role assignment task failed, failure reason:%s", *task.FailureReason) } - return fmt.Errorf("CreateRoleAssignment failed") + return fmt.Errorf("create role assignment task failed") } if task.TaskId == nil { - return fmt.Errorf("task id is nil") + return fmt.Errorf("create role assignment task id is nil") } taskId := *task.TaskId roleConfigurationId := *task.RoleConfigurationId conf := tccommon.BuildStateChangeConf([]string{}, []string{TASK_STATUS_SUCCESS, TASK_STATUS_FAILED}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, taskId, []string{})) - if _, e := conf.WaitForState(); e != nil { + if object, e := conf.WaitForState(); e != nil { return e + } else { + taskStatus := object.(*organization.TaskStatus) + if taskStatus.Status != nil && *taskStatus.Status == TASK_STATUS_FAILED { + return fmt.Errorf("create role assignment task failed") + } } targetUinString := strconv.FormatInt(targetUin, 10) @@ -322,14 +327,20 @@ func resourceTencentCloudIdentityCenterRoleAssignmentDelete(d *schema.ResourceDa task := deleteRoleAssignmentResponse.Response.Task if task.Status != nil && *task.Status == TASK_STATUS_FAILED { if task.FailureReason != nil { - return fmt.Errorf("DeleteRoleAssignment failed, failure reason:%s", *task.FailureReason) + return fmt.Errorf("delete role assignment failed, failure reason:%s", *task.FailureReason) } - return fmt.Errorf("DeleteRoleAssignment failed") + return fmt.Errorf("delete role assignment failed") } - if task.TaskId != nil { - conf := tccommon.BuildStateChangeConf([]string{}, []string{"Success"}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, *task.TaskId, []string{})) - if _, e := conf.WaitForState(); e != nil { - return e + if task.TaskId == nil { + return fmt.Errorf("delete role assignment task id is nil") + } + conf := tccommon.BuildStateChangeConf([]string{}, []string{TASK_STATUS_SUCCESS, TASK_STATUS_FAILED}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, *task.TaskId, []string{})) + if object, e := conf.WaitForState(); e != nil { + return e + } else { + taskStatus := object.(*organization.TaskStatus) + if taskStatus.Status != nil && *taskStatus.Status == TASK_STATUS_FAILED { + return fmt.Errorf("delete role assignment failed") } } @@ -352,10 +363,28 @@ func resourceTencentCloudIdentityCenterRoleAssignmentDelete(d *schema.ResourceDa return err } - if dismantleRoleConfigurationResponse.Response != nil && dismantleRoleConfigurationResponse.Response.Task != nil && dismantleRoleConfigurationResponse.Response.Task.TaskId != nil { - conf := tccommon.BuildStateChangeConf([]string{}, []string{TASK_STATUS_SUCCESS, TASK_STATUS_FAILED}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, *dismantleRoleConfigurationResponse.Response.Task.TaskId, []string{})) - if _, e := conf.WaitForState(); e != nil { - return e + if dismantleRoleConfigurationResponse == nil || dismantleRoleConfigurationResponse.Response == nil { + return fmt.Errorf("dismantle role assignment response is nil") + } + if dismantleRoleConfigurationResponse.Response.Task == nil { + return fmt.Errorf("dismantle role assignment task is nil") + } + dismantleTask := dismantleRoleConfigurationResponse.Response.Task + + if dismantleTask.TaskStatus != nil && *dismantleTask.TaskStatus == TASK_STATUS_FAILED { + return fmt.Errorf("dismantle role assignment task failed") + } + + if dismantleTask.TaskId == nil { + return fmt.Errorf("dismantle role assignment task id is nil") + } + conf = tccommon.BuildStateChangeConf([]string{}, []string{TASK_STATUS_SUCCESS, TASK_STATUS_FAILED}, 2*tccommon.ReadRetryTimeout, time.Second, service.AssignmentTaskStatusStateRefreshFunc(zoneId, *dismantleTask.TaskId, []string{})) + if object, e := conf.WaitForState(); e != nil { + return e + } else { + taskStatus := object.(*organization.TaskStatus) + if taskStatus.Status != nil && *taskStatus.Status == TASK_STATUS_FAILED { + return fmt.Errorf("dismantle role assignment task failed") } }