Skip to content

Commit f7b5d9a

Browse files
committed
feat(identitycenter): add datasource system policy attachments
1 parent e9e3c3b commit f7b5d9a

File tree

4 files changed

+227
-0
lines changed

4 files changed

+227
-0
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
---
2+
subcategory: "IAM Identity Center"
3+
layout: "huaweicloud"
4+
page_title: "HuaweiCloud: huaweicloud_identitycenter_system_policy_attachments"
5+
description: |-
6+
Use this data source to get the Identity Center system policy attachments.
7+
---
8+
9+
# huaweicloud_identitycenter_system_policy_attachments
10+
11+
Use this data source to get the Identity Center system policy attachments.
12+
13+
## Example Usage
14+
15+
```hcl
16+
variable "instance_id" {}
17+
variable "permission_set_id" {}
18+
19+
data "huaweicloud_identitycenter_system_policy_attachments" "test" {
20+
instance_id = var.instance_id
21+
permission_set_id = var.permission_set_id
22+
}
23+
```
24+
25+
## Argument Reference
26+
27+
The following arguments are supported:
28+
29+
* `region` - (Optional, String) Specifies the region in which to query the resource.
30+
If omitted, the provider-level region will be used.
31+
32+
* `instance_id` - (Required, String) Specifies the ID of an IAM Identity Center instance.
33+
34+
* `permission_set_id` - (Required, String) Specifies the ID of a permission set.
35+
36+
## Attribute Reference
37+
38+
In addition to all arguments above, the following attributes are exported:
39+
40+
* `id` - The data source ID.
41+
42+
* `policies` - The list of IAM system-defined policies.
43+
44+
The [policies](#policies_struct) structure is documented below.
45+
46+
<a name="policies_struct"></a>
47+
The `policies` block supports:
48+
49+
* `id` - The ID of the IAM system-defined policy.
50+
51+
* `name` - The name of the IAM system-defined policy.

huaweicloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,7 @@ func Provider() *schema.Provider {
877877
"huaweicloud_identitycenter_permission_sets": identitycenter.DataSourceIdentitycenterPermissionSets(),
878878
"huaweicloud_identitycenter_account_provisioning_permission_sets": identitycenter.DataSourceAccountProvisioningPermissionSets(),
879879
"huaweicloud_identitycenter_permission_set_provisioning_accounts": identitycenter.DataSourcePermissionSetProvisioningAccounts(),
880+
"huaweicloud_identitycenter_system_policy_attachments": identitycenter.DataSourceIdentitycenterSystemPolicyAttachments(),
880881

881882
"huaweicloud_iec_bandwidths": iec.DataSourceBandWidths(),
882883
"huaweicloud_iec_eips": iec.DataSourceEips(),
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package identitycenter
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
9+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/services/acceptance"
10+
)
11+
12+
func TestAccDataSourceSystemPolicyAttachments_basic(t *testing.T) {
13+
dataSource := "data.huaweicloud_identitycenter_system_policy_attachments.test"
14+
rName := acceptance.RandomAccResourceName()
15+
dc := acceptance.InitDataSourceCheck(dataSource)
16+
17+
resource.ParallelTest(t, resource.TestCase{
18+
PreCheck: func() {
19+
acceptance.TestAccPreCheck(t)
20+
acceptance.TestAccPreCheckMultiAccount(t)
21+
},
22+
ProviderFactories: acceptance.TestAccProviderFactories,
23+
Steps: []resource.TestStep{
24+
{
25+
Config: testDataSourceSystemPolicyAttachments_basic(rName),
26+
Check: resource.ComposeTestCheckFunc(
27+
dc.CheckResourceExists(),
28+
resource.TestCheckResourceAttrSet(dataSource, "policies.#"),
29+
resource.TestCheckResourceAttrSet(dataSource, "policies.0.id"),
30+
),
31+
},
32+
},
33+
})
34+
}
35+
36+
func testDataSourceSystemPolicyAttachments_basic(name string) string {
37+
return fmt.Sprintf(`
38+
%[1]s
39+
40+
data "huaweicloud_identitycenter_system_policy_attachments" "test" {
41+
instance_id = data.huaweicloud_identitycenter_instance.system.id
42+
permission_set_id = huaweicloud_identitycenter_permission_set.test.id
43+
44+
depends_on = [huaweicloud_identitycenter_system_policy_attachment.test]
45+
}
46+
`, testSystemPolicyAttachment_basic(name))
47+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
// Generated by PMS #509
2+
package identitycenter
3+
4+
import (
5+
"context"
6+
"strings"
7+
8+
"github.com/hashicorp/go-multierror"
9+
"github.com/hashicorp/go-uuid"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
"github.com/tidwall/gjson"
13+
14+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/config"
15+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/helper/httphelper"
16+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/helper/schemas"
17+
)
18+
19+
func DataSourceIdentitycenterSystemPolicyAttachments() *schema.Resource {
20+
return &schema.Resource{
21+
ReadContext: dataSourceIdentitycenterSystemPolicyAttachmentsRead,
22+
23+
Schema: map[string]*schema.Schema{
24+
"region": {
25+
Type: schema.TypeString,
26+
Optional: true,
27+
Computed: true,
28+
Description: `Specifies the region in which to query the resource. If omitted, the provider-level region will be used.`,
29+
},
30+
"instance_id": {
31+
Type: schema.TypeString,
32+
Required: true,
33+
Description: `Specifies the ID of an IAM Identity Center instance.`,
34+
},
35+
"permission_set_id": {
36+
Type: schema.TypeString,
37+
Required: true,
38+
Description: `Specifies the ID of a permission set.`,
39+
},
40+
"policies": {
41+
Type: schema.TypeList,
42+
Computed: true,
43+
Description: `The list of IAM system-defined policies.`,
44+
Elem: &schema.Resource{
45+
Schema: map[string]*schema.Schema{
46+
"id": {
47+
Type: schema.TypeString,
48+
Computed: true,
49+
Description: `The ID of the IAM system-defined policy.`,
50+
},
51+
"name": {
52+
Type: schema.TypeString,
53+
Computed: true,
54+
Description: `The name of the IAM system-defined policy.`,
55+
},
56+
},
57+
},
58+
},
59+
},
60+
}
61+
}
62+
63+
type SystemPolicyAttachmentsDSWrapper struct {
64+
*schemas.ResourceDataWrapper
65+
Config *config.Config
66+
}
67+
68+
func newSystemPolicyAttachmentsDSWrapper(d *schema.ResourceData, meta interface{}) *SystemPolicyAttachmentsDSWrapper {
69+
return &SystemPolicyAttachmentsDSWrapper{
70+
ResourceDataWrapper: schemas.NewSchemaWrapper(d),
71+
Config: meta.(*config.Config),
72+
}
73+
}
74+
75+
func dataSourceIdentitycenterSystemPolicyAttachmentsRead(_ context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
76+
wrapper := newSystemPolicyAttachmentsDSWrapper(d, meta)
77+
lisManRolInPerSetRst, err := wrapper.ListManagedRolesInPermissionSet()
78+
if err != nil {
79+
return diag.FromErr(err)
80+
}
81+
82+
id, err := uuid.GenerateUUID()
83+
if err != nil {
84+
return diag.FromErr(err)
85+
}
86+
d.SetId(id)
87+
88+
err = wrapper.listManagedRolesInPermissionSetToSchema(lisManRolInPerSetRst)
89+
if err != nil {
90+
return diag.FromErr(err)
91+
}
92+
93+
return nil
94+
}
95+
96+
// @API IDENTITYCENTER GET /v1/instances/{instance_id}/permission-sets/{permission_set_id}/managed-roles
97+
func (w *SystemPolicyAttachmentsDSWrapper) ListManagedRolesInPermissionSet() (*gjson.Result, error) {
98+
client, err := w.NewClient(w.Config, "identitycenter")
99+
if err != nil {
100+
return nil, err
101+
}
102+
103+
uri := "/v1/instances/{instance_id}/permission-sets/{permission_set_id}/managed-roles"
104+
uri = strings.ReplaceAll(uri, "{instance_id}", w.Get("instance_id").(string))
105+
uri = strings.ReplaceAll(uri, "{permission_set_id}", w.Get("permission_set_id").(string))
106+
return httphelper.New(client).
107+
Method("GET").
108+
URI(uri).
109+
MarkerPager("attached_managed_roles", "page_info.next_marker", "marker").
110+
Request().
111+
Result()
112+
}
113+
114+
func (w *SystemPolicyAttachmentsDSWrapper) listManagedRolesInPermissionSetToSchema(body *gjson.Result) error {
115+
d := w.ResourceData
116+
mErr := multierror.Append(nil,
117+
d.Set("region", w.Config.GetRegion(w.ResourceData)),
118+
d.Set("policies", schemas.SliceToList(body.Get("attached_managed_roles"),
119+
func(policies gjson.Result) any {
120+
return map[string]any{
121+
"id": policies.Get("role_id").Value(),
122+
"name": policies.Get("role_name").Value(),
123+
}
124+
},
125+
)),
126+
)
127+
return mErr.ErrorOrNil()
128+
}

0 commit comments

Comments
 (0)