Skip to content

Commit 40b1d05

Browse files
committed
feat(identitycenter): add datasource permission set provisionings
1 parent b52b574 commit 40b1d05

File tree

4 files changed

+268
-0
lines changed

4 files changed

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

huaweicloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,7 @@ func Provider() *schema.Provider {
874874
"huaweicloud_identitycenter_permission_sets": identitycenter.DataSourceIdentitycenterPermissionSets(),
875875
"huaweicloud_identitycenter_account_provisioning_permission_sets": identitycenter.DataSourceAccountProvisioningPermissionSets(),
876876
"huaweicloud_identitycenter_permission_set_provisioning_accounts": identitycenter.DataSourcePermissionSetProvisioningAccounts(),
877+
"huaweicloud_identitycenter_permission_set_provisionings": identitycenter.DataSourceIdentitycenterPermissionSetProvisionings(),
877878

878879
"huaweicloud_iec_bandwidths": iec.DataSourceBandWidths(),
879880
"huaweicloud_iec_eips": iec.DataSourceEips(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package identitycenter
2+
3+
import (
4+
"fmt"
5+
"regexp"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
10+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/services/acceptance"
11+
)
12+
13+
func TestAccDataSourcePermissionSetProvisionings_basic(t *testing.T) {
14+
dataSource := "data.huaweicloud_identitycenter_permission_set_provisionings.test"
15+
rName := acceptance.RandomAccResourceName()
16+
dc := acceptance.InitDataSourceCheck(dataSource)
17+
18+
resource.ParallelTest(t, resource.TestCase{
19+
PreCheck: func() {
20+
acceptance.TestAccPreCheck(t)
21+
acceptance.TestAccPreCheckMultiAccount(t)
22+
acceptance.TestAccPreCheckIdentityCenterAccountId(t)
23+
},
24+
ProviderFactories: acceptance.TestAccProviderFactories,
25+
Steps: []resource.TestStep{
26+
{
27+
Config: testDataSourcePermissionSetProvisionings_basic(rName),
28+
Check: resource.ComposeTestCheckFunc(
29+
dc.CheckResourceExists(),
30+
resource.TestCheckResourceAttrSet(dataSource, "provisionings.#"),
31+
resource.TestCheckResourceAttrSet(dataSource, "provisionings.0.request_id"),
32+
resource.TestCheckResourceAttrSet(dataSource, "provisionings.0.status"),
33+
resource.TestMatchResourceAttr(dataSource,
34+
"provisionings.0.created_at", regexp.MustCompile(`^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}?(Z|([+-]\d{2}:\d{2}))$`)),
35+
resource.TestCheckOutput("is_status_filter_useful", "true"),
36+
),
37+
},
38+
},
39+
})
40+
}
41+
42+
func testDataSourcePermissionSetProvisionings_basic(name string) string {
43+
return fmt.Sprintf(`
44+
%[1]s
45+
46+
data "huaweicloud_identitycenter_permission_set_provisionings" "test" {
47+
instance_id = data.huaweicloud_identitycenter_instance.test.id
48+
}
49+
50+
locals {
51+
status = data.huaweicloud_identitycenter_permission_set_provisionings.test.provisionings[0].status
52+
}
53+
54+
data "huaweicloud_identitycenter_permission_set_provisionings" "filter_by_status" {
55+
instance_id = data.huaweicloud_identitycenter_instance.test.id
56+
status = local.status
57+
}
58+
59+
locals {
60+
list_by_status = data.huaweicloud_identitycenter_permission_set_provisionings.filter_by_status.provisionings
61+
}
62+
63+
output "is_status_filter_useful" {
64+
value = length(local.list_by_status) > 0 && alltrue(
65+
[for v in local.list_by_status[*].status : v == local.status]
66+
)
67+
}
68+
`, testProvisionPermissionSet_basic(name))
69+
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
// Generated by PMS #485
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+
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/utils"
18+
)
19+
20+
func DataSourceIdentitycenterPermissionSetProvisionings() *schema.Resource {
21+
return &schema.Resource{
22+
ReadContext: dataSourceIdentitycenterPermissionSetProvisioningsRead,
23+
24+
Schema: map[string]*schema.Schema{
25+
"region": {
26+
Type: schema.TypeString,
27+
Optional: true,
28+
Computed: true,
29+
Description: `Specifies the region in which to query the resource. If omitted, the provider-level region will be used.`,
30+
},
31+
"instance_id": {
32+
Type: schema.TypeString,
33+
Required: true,
34+
Description: `Specifies the ID of an IAM Identity Center instance.`,
35+
},
36+
"status": {
37+
Type: schema.TypeString,
38+
Optional: true,
39+
Description: `Specifies the status of the permission set provisioning process.`,
40+
},
41+
"provisionings": {
42+
Type: schema.TypeList,
43+
Computed: true,
44+
Description: `The authorization status of a permission set.`,
45+
Elem: &schema.Resource{
46+
Schema: map[string]*schema.Schema{
47+
"created_at": {
48+
Type: schema.TypeString,
49+
Computed: true,
50+
Description: `The date when a permission set was created.`,
51+
},
52+
"request_id": {
53+
Type: schema.TypeString,
54+
Computed: true,
55+
Description: `The unique ID of a request.`,
56+
},
57+
"status": {
58+
Type: schema.TypeString,
59+
Computed: true,
60+
Description: `The authorization status of a permission set.`,
61+
},
62+
},
63+
},
64+
},
65+
},
66+
}
67+
}
68+
69+
type PermissionSetProvisioningsDSWrapper struct {
70+
*schemas.ResourceDataWrapper
71+
Config *config.Config
72+
}
73+
74+
func newPermissionSetProvisioningsDSWrapper(d *schema.ResourceData, meta interface{}) *PermissionSetProvisioningsDSWrapper {
75+
return &PermissionSetProvisioningsDSWrapper{
76+
ResourceDataWrapper: schemas.NewSchemaWrapper(d),
77+
Config: meta.(*config.Config),
78+
}
79+
}
80+
81+
func dataSourceIdentitycenterPermissionSetProvisioningsRead(_ context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
82+
wrapper := newPermissionSetProvisioningsDSWrapper(d, meta)
83+
lisPerSetProStaRst, err := wrapper.ListPermissionSetProvisioningStatus()
84+
if err != nil {
85+
return diag.FromErr(err)
86+
}
87+
88+
id, err := uuid.GenerateUUID()
89+
if err != nil {
90+
return diag.FromErr(err)
91+
}
92+
d.SetId(id)
93+
94+
err = wrapper.listPermissionSetProvisioningStatusToSchema(lisPerSetProStaRst)
95+
if err != nil {
96+
return diag.FromErr(err)
97+
}
98+
99+
return nil
100+
}
101+
102+
// @API IDENTITYCENTER GET /v1/instances/{instance_id}/permission-sets/provisioning-statuses
103+
func (w *PermissionSetProvisioningsDSWrapper) ListPermissionSetProvisioningStatus() (*gjson.Result, error) {
104+
client, err := w.NewClient(w.Config, "identitycenter")
105+
if err != nil {
106+
return nil, err
107+
}
108+
109+
uri := "/v1/instances/{instance_id}/permission-sets/provisioning-statuses"
110+
uri = strings.ReplaceAll(uri, "{instance_id}", w.Get("instance_id").(string))
111+
params := map[string]any{
112+
"status": w.Get("status"),
113+
}
114+
params = utils.RemoveNil(params)
115+
return httphelper.New(client).
116+
Method("GET").
117+
URI(uri).
118+
Query(params).
119+
MarkerPager("permission_sets_provisioning_status", "page_info.next_marker", "marker").
120+
Request().
121+
Result()
122+
}
123+
124+
func (w *PermissionSetProvisioningsDSWrapper) listPermissionSetProvisioningStatusToSchema(body *gjson.Result) error {
125+
d := w.ResourceData
126+
mErr := multierror.Append(nil,
127+
d.Set("region", w.Config.GetRegion(w.ResourceData)),
128+
d.Set("provisionings", schemas.SliceToList(body.Get("permission_sets_provisioning_status"),
129+
func(provisionings gjson.Result) any {
130+
return map[string]any{
131+
"created_at": w.setPerSetProStaCreDate(provisionings),
132+
"request_id": provisionings.Get("request_id").Value(),
133+
"status": provisionings.Get("status").Value(),
134+
}
135+
},
136+
)),
137+
)
138+
return mErr.ErrorOrNil()
139+
}
140+
141+
func (*PermissionSetProvisioningsDSWrapper) setPerSetProStaCreDate(data gjson.Result) string {
142+
return utils.FormatTimeStampRFC3339((data.Get("created_date").Int())/1000, false)
143+
}

0 commit comments

Comments
 (0)