Skip to content

Commit 39eb269

Browse files
authored
feat(identity): added trusted profile identities (IBM-Cloud#6316)
1 parent df7c33a commit 39eb269

12 files changed

+761
-51
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Examples for IAM Identity Services
2+
3+
These examples illustrate how to use the resources and data sources associated with IAM Identity Services.
4+
5+
The following resources are supported:
6+
* ibm_iam_trusted_profile_identities
7+
8+
The following data sources are supported:
9+
* ibm_iam_trusted_profile_identities
10+
11+
## Usage
12+
13+
To run this example, execute the following commands:
14+
15+
```bash
16+
$ terraform init
17+
$ terraform plan
18+
$ terraform apply
19+
```
20+
21+
Run `terraform destroy` when you don't need these resources.
22+
23+
## IAM Identity Services resources
24+
25+
### Resource: ibm_iam_trusted_profile_identities
26+
27+
```hcl
28+
resource "ibm_iam_trusted_profile_identities" "iam_trusted_profile_identities_instance" {
29+
profile_id = var.iam_trusted_profile_identities_profile_id
30+
if_match = var.iam_trusted_profile_identities_if_match
31+
identities = var.iam_trusted_profile_identities_identities
32+
}
33+
```
34+
35+
#### Inputs
36+
37+
| Name | Description | Type | Required |
38+
|------|-------------|------|---------|
39+
| ibmcloud\_api\_key | IBM Cloud API key | `string` | true |
40+
| profile_id | ID of the trusted profile. | `string` | true |
41+
| if_match | Entity tag of the Identities to be updated. Specify the tag that you retrieved when reading the Profile Identities. This value helps identify parallel usage of this API. Pass * to indicate updating any available version, which may result in stale updates. | `string` | true |
42+
| identities | List of identities. | `list()` | false |
43+
44+
## IAM Identity Services data sources
45+
46+
### Data source: ibm_iam_trusted_profile_identities
47+
48+
```hcl
49+
data "ibm_iam_trusted_profile_identities" "iam_trusted_profile_identities_instance" {
50+
profile_id = var.data_iam_trusted_profile_identities_profile_id
51+
}
52+
```
53+
54+
#### Inputs
55+
56+
| Name | Description | Type | Required |
57+
|------|-------------|------|---------|
58+
| profile_id | ID of the trusted profile. | `string` | true |
59+
60+
#### Outputs
61+
62+
| Name | Description |
63+
|------|-------------|
64+
| entity_tag | Entity tag of the profile identities response. |
65+
| identities | List of identities. |
66+
67+
## Assumptions
68+
69+
1. TODO
70+
71+
## Notes
72+
73+
1. TODO
74+
75+
## Requirements
76+
77+
| Name | Version |
78+
|------|---------|
79+
| terraform | ~> 0.12 |
80+
81+
## Providers
82+
83+
| Name | Version |
84+
|------|---------|
85+
| ibm | 1.13.1 |
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
provider "ibm" {
2+
ibmcloud_api_key = var.ibmcloud_api_key
3+
}
4+
5+
// Provision iam_trusted_profile_identities resource instance
6+
resource "ibm_iam_trusted_profile_identities" "iam_trusted_profile_identities_instance" {
7+
profile_id = var.iam_trusted_profile_identities_profile_id
8+
9+
dynamic "identities" {
10+
for_each = var.iam_trusted_profile_identities
11+
content {
12+
iam_id = identities.value.iam_id
13+
type = identities.value.type
14+
identifier = identities.value.identifier
15+
accounts = identities.value.accounts
16+
description = identities.value.description
17+
}
18+
}
19+
}
20+
21+
// Create iam_trusted_profile_identities data source
22+
data "ibm_iam_trusted_profile_identities" "iam_trusted_profile_identities_instance" {
23+
profile_id = var.iam_trusted_profile_identities_profile_id
24+
}
25+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// This output allows iam_trusted_profile_identities data to be referenced by other resources and the terraform CLI
2+
// Modify this output if only certain data should be exposed
3+
output "ibm_iam_trusted_profile_identities" {
4+
value = ibm_iam_trusted_profile_identities.iam_trusted_profile_identities_instance
5+
description = "iam_trusted_profile_identities resource instance"
6+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
variable "ibmcloud_api_key" {
2+
description = "IBM Cloud API key"
3+
type = string
4+
}
5+
6+
// Resource arguments for iam_trusted_profile_identities
7+
variable "iam_trusted_profile_identities_profile_id" {
8+
description = "ID of the trusted profile."
9+
type = string
10+
default = "profile_id"
11+
}
12+
variable "iam_trusted_profile_identities_if_match" {
13+
description = "Entity tag of the Identities to be updated. Specify the tag that you retrieved when reading the Profile Identities. This value helps identify parallel usage of this API. Pass * to indicate updating any available version, which may result in stale updates."
14+
type = string
15+
default = "if_match"
16+
}
17+
variable "iam_trusted_profile_identities" {
18+
description = "List of identities for the trusted profile."
19+
type = list(object({
20+
iam_id = string
21+
type = string
22+
identifier = string
23+
accounts = list(string)
24+
description = string
25+
}))
26+
default = [
27+
{
28+
iam_id = "IBMid-5500082WK4"
29+
type = "user"
30+
identifier = "IBMid-5500082WK4"
31+
accounts = ["86a1004d3f1848a291de32874cb48120"]
32+
description = "tf_description_profile identity description"
33+
}
34+
]
35+
}
36+
37+
// Data source arguments for iam_trusted_profile_identities
38+
variable "data_iam_trusted_profile_identities_profile_id" {
39+
description = "ID of the trusted profile."
40+
type = string
41+
default = "profile_id"
42+
}
43+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
terraform {
2+
required_version = ">= 1.0"
3+
required_providers {
4+
ibm = {
5+
source = "IBM-Cloud/ibm"
6+
version = "1.51.0"
7+
}
8+
}
9+
}

ibm/provider/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,6 +1274,7 @@ func Provider() *schema.Provider {
12741274
"ibm_iam_api_key": iamidentity.ResourceIBMIAMApiKey(),
12751275
"ibm_iam_trusted_profile": iamidentity.ResourceIBMIAMTrustedProfile(),
12761276
"ibm_iam_trusted_profile_identity": iamidentity.ResourceIBMIamTrustedProfileIdentity(),
1277+
"ibm_iam_trusted_profile_identities": iamidentity.ResourceIBMIamTrustedProfileIdentities(),
12771278
"ibm_iam_trusted_profile_claim_rule": iamidentity.ResourceIBMIAMTrustedProfileClaimRule(),
12781279
"ibm_iam_trusted_profile_link": iamidentity.ResourceIBMIAMTrustedProfileLink(),
12791280
"ibm_iam_trusted_profile_policy": iampolicy.ResourceIBMIAMTrustedProfilePolicy(),

ibm/service/iamidentity/data_source_ibm_iam_trusted_profile_identities.go

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
1-
// Copyright IBM Corp. 2023 All Rights Reserved.
1+
// Copyright IBM Corp. 2025 All Rights Reserved.
22
// Licensed under the Mozilla Public License v2.0
33

4+
/*
5+
* IBM OpenAPI Terraform Generator Version: 3.103.0-e8b84313-20250402-201816
6+
*/
7+
48
package iamidentity
59

610
import (
711
"context"
812
"fmt"
913
"log"
10-
"time"
1114

1215
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1316
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1417

1518
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
19+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
20+
"github.com/IBM/go-sdk-core/v5/core"
1621
"github.com/IBM/platform-services-go-sdk/iamidentityv1"
1722
)
1823

@@ -75,57 +80,57 @@ func DataSourceIBMIamTrustedProfileIdentities() *schema.Resource {
7580
func dataSourceIBMIamTrustedProfileIdentitiesRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
7681
iamIdentityClient, err := meta.(conns.ClientSession).IAMIdentityV1API()
7782
if err != nil {
78-
return diag.FromErr(err)
83+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_iam_trusted_profile_identities", "read", "initialize-client")
84+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
85+
return tfErr.GetDiag()
7986
}
8087

8188
getProfileIdentitiesOptions := &iamidentityv1.GetProfileIdentitiesOptions{}
8289

8390
getProfileIdentitiesOptions.SetProfileID(d.Get("profile_id").(string))
8491

85-
profileIdentitiesResponse, response, err := iamIdentityClient.GetProfileIdentitiesWithContext(context, getProfileIdentitiesOptions)
92+
profileIdentitiesResponse, _, err := iamIdentityClient.GetProfileIdentitiesWithContext(context, getProfileIdentitiesOptions)
8693
if err != nil {
87-
log.Printf("[DEBUG] GetProfileIdentitiesWithContext failed %s\n%s", err, response)
88-
return diag.FromErr(fmt.Errorf("GetProfileIdentitiesWithContext failed %s\n%s", err, response))
94+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetProfileIdentitiesWithContext failed: %s", err.Error()), "(Data) ibm_iam_trusted_profile_identities", "read")
95+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
96+
return tfErr.GetDiag()
8997
}
9098

91-
d.SetId(dataSourceIBMIamTrustedProfileIdentitiesID(d))
99+
d.SetId(*getProfileIdentitiesOptions.ProfileID)
92100

93-
if err = d.Set("entity_tag", profileIdentitiesResponse.EntityTag); err != nil {
94-
return diag.FromErr(fmt.Errorf("Error setting entity_tag: %s", err))
101+
if !core.IsNil(profileIdentitiesResponse.EntityTag) {
102+
if err = d.Set("entity_tag", profileIdentitiesResponse.EntityTag); err != nil {
103+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting entity_tag: %s", err), "(Data) ibm_iam_trusted_profile_identities", "read", "set-entity_tag").GetDiag()
104+
}
95105
}
96106

97-
identities := []map[string]interface{}{}
98-
if profileIdentitiesResponse.Identities != nil {
99-
for _, modelItem := range profileIdentitiesResponse.Identities {
100-
modelMap, err := dataSourceIBMIamTrustedProfileIdentitiesProfileIdentityResponseToMap(&modelItem)
107+
if !core.IsNil(profileIdentitiesResponse.Identities) {
108+
identities := []map[string]interface{}{}
109+
for _, identitiesItem := range profileIdentitiesResponse.Identities {
110+
identitiesItemMap, err := DataSourceIBMIamTrustedProfileIdentitiesProfileIdentityResponseToMap(&identitiesItem) // #nosec G601
101111
if err != nil {
102-
return diag.FromErr(err)
112+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_iam_trusted_profile_identities", "read", "identities-to-map").GetDiag()
103113
}
104-
identities = append(identities, modelMap)
114+
identities = append(identities, identitiesItemMap)
115+
}
116+
if err = d.Set("identities", identities); err != nil {
117+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting identities: %s", err), "(Data) ibm_iam_trusted_profile_identities", "read", "set-identities").GetDiag()
105118
}
106-
}
107-
if err = d.Set("identities", identities); err != nil {
108-
return diag.FromErr(fmt.Errorf("Error setting identities %s", err))
109119
}
110120

111121
return nil
112122
}
113123

114-
// dataSourceIBMIamTrustedProfileIdentitiesID returns a reasonable ID for the list.
115-
func dataSourceIBMIamTrustedProfileIdentitiesID(d *schema.ResourceData) string {
116-
return time.Now().UTC().String()
117-
}
118-
119-
func dataSourceIBMIamTrustedProfileIdentitiesProfileIdentityResponseToMap(model *iamidentityv1.ProfileIdentityResponse) (map[string]interface{}, error) {
124+
func DataSourceIBMIamTrustedProfileIdentitiesProfileIdentityResponseToMap(model *iamidentityv1.ProfileIdentityResponse) (map[string]interface{}, error) {
120125
modelMap := make(map[string]interface{})
121-
modelMap["iam_id"] = model.IamID
122-
modelMap["identifier"] = model.Identifier
123-
modelMap["type"] = model.Type
126+
modelMap["iam_id"] = *model.IamID
127+
modelMap["identifier"] = *model.Identifier
128+
modelMap["type"] = *model.Type
124129
if model.Accounts != nil {
125130
modelMap["accounts"] = model.Accounts
126131
}
127132
if model.Description != nil {
128-
modelMap["description"] = model.Description
133+
modelMap["description"] = *model.Description
129134
}
130135
return modelMap, nil
131136
}
Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,88 @@
1-
// Copyright IBM Corp. 2023 All Rights Reserved.
1+
// Copyright IBM Corp. 2025 All Rights Reserved.
22
// Licensed under the Mozilla Public License v2.0
33

4+
/*
5+
* IBM OpenAPI Terraform Generator Version: 3.103.0-e8b84313-20250402-201816
6+
*/
7+
48
package iamidentity_test
59

610
import (
711
"fmt"
812
"testing"
913

14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
1015
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1116

1217
acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest"
18+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/service/iamidentity"
19+
"github.com/IBM/go-sdk-core/v5/core"
20+
"github.com/IBM/platform-services-go-sdk/iamidentityv1"
21+
"github.com/stretchr/testify/assert"
1322
)
1423

1524
func TestAccIBMIamTrustedProfileIdentitiesDataSourceBasic(t *testing.T) {
25+
profileIdentitiesResponseProfileID := acc.IAMTrustedProfileID
26+
profileIdentitiesResponseIfMatch := fmt.Sprintf("tf_if_match_%d", acctest.RandIntRange(10, 100))
27+
ibmID1 := acc.Ibmid1
28+
1629
resource.Test(t, resource.TestCase{
1730
PreCheck: func() { acc.TestAccPreCheck(t) },
1831
Providers: acc.TestAccProviders,
1932
Steps: []resource.TestStep{
20-
{
21-
Config: testAccCheckIBMIamTrustedProfileIdentitiesDataSourceConfigBasic(),
33+
resource.TestStep{
34+
Config: func() string {
35+
var _ string = profileIdentitiesResponseIfMatch
36+
return testAccCheckIBMIamTrustedProfileIdentitiesDataSourceConfigBasic(profileIdentitiesResponseProfileID, ibmID1)
37+
}(),
2238
Check: resource.ComposeTestCheckFunc(
23-
resource.TestCheckResourceAttrSet("data.ibm_iam_trusted_profile_identities.iam_trusted_profile_identities", "id"),
24-
resource.TestCheckResourceAttrSet("data.ibm_iam_trusted_profile_identities.iam_trusted_profile_identities", "profile_id"),
39+
resource.TestCheckResourceAttrSet("data.ibm_iam_trusted_profile_identities.iam_trusted_profile_identities_instance", "id"),
40+
resource.TestCheckResourceAttrSet("data.ibm_iam_trusted_profile_identities.iam_trusted_profile_identities_instance", "profile_id"),
2541
),
2642
},
2743
},
2844
})
2945
}
3046

31-
func testAccCheckIBMIamTrustedProfileIdentitiesDataSourceConfigBasic() string {
32-
profileID := acc.IAMTrustedProfileID
47+
func testAccCheckIBMIamTrustedProfileIdentitiesDataSourceConfigBasic(profileIdentitiesResponseProfileID, ibmID1 string) string {
3348
return fmt.Sprintf(`
34-
data "ibm_iam_trusted_profile_identities" "iam_trusted_profile_identities" {
49+
resource "ibm_iam_trusted_profile_identities" "iam_trusted_profile_identities_instance" {
3550
profile_id = "%s"
51+
identities {
52+
iam_id = "%s"
53+
type = "user"
54+
identifier = "%s"
55+
accounts = ["86a1004d3f1848a291de32874cb48120"]
56+
description = "tf_description_profile identity description"
57+
}
3658
}
37-
`, profileID)
59+
60+
data "ibm_iam_trusted_profile_identities" "iam_trusted_profile_identities_instance" {
61+
profile_id = ibm_iam_trusted_profile_identities.iam_trusted_profile_identities_instance.profile_id
62+
}
63+
`, profileIdentitiesResponseProfileID, ibmID1, ibmID1)
64+
}
65+
66+
func TestDataSourceIBMIamTrustedProfileIdentitiesProfileIdentityResponseToMap(t *testing.T) {
67+
checkResult := func(result map[string]interface{}) {
68+
model := make(map[string]interface{})
69+
model["iam_id"] = "testString"
70+
model["identifier"] = "testString"
71+
model["type"] = "user"
72+
model["accounts"] = []string{"testString"}
73+
model["description"] = "testString"
74+
75+
assert.Equal(t, result, model)
76+
}
77+
78+
model := new(iamidentityv1.ProfileIdentityResponse)
79+
model.IamID = core.StringPtr("testString")
80+
model.Identifier = core.StringPtr("testString")
81+
model.Type = core.StringPtr("user")
82+
model.Accounts = []string{"testString"}
83+
model.Description = core.StringPtr("testString")
84+
85+
result, err := iamidentity.DataSourceIBMIamTrustedProfileIdentitiesProfileIdentityResponseToMap(model)
86+
assert.Nil(t, err)
87+
checkResult(result)
3888
}

0 commit comments

Comments
 (0)