Skip to content

Commit b5c731e

Browse files
EspenAlbertoarbusi
andauthored
feat: Adds support for OIDC WORKLOAD IdP type to federated_settings_identity_provider (#2318)
--------- Co-authored-by: Oriol Arbusi <[email protected]>
1 parent 8890692 commit b5c731e

10 files changed

+254
-14
lines changed

.changelog/2318.txt

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
```release-note:enhancement
2+
resource/mongodbatlas_federated_settings_identity_provider: Adds OIDC Workload support
3+
```
4+
5+
```release-note:enhancement
6+
data-source/mongodbatlas_federated_settings_identity_provider: Adds OIDC Workload support
7+
```
8+
9+
```release-note:enhancement
10+
data-source/mongodbatlas_federated_settings_identity_providers: Adds OIDC Workload support
11+
```
12+
13+
```release-note:enhancement
14+
data-source/mongodbatlas_federated_settings_identity_providers: Adds filtering support for Protocol and IdP type
15+
```

internal/service/federatedsettingsidentityprovider/data_source_federated_settings_identity_provider.go

+8
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,10 @@ func DataSource() *schema.Resource {
236236
Type: schema.TypeString,
237237
Computed: true,
238238
},
239+
"idp_type": {
240+
Type: schema.TypeString,
241+
Computed: true,
242+
},
239243
},
240244
}
241245
}
@@ -347,6 +351,10 @@ func dataSourceRead(ctx context.Context, d *schema.ResourceData, meta any) diag.
347351
return diag.FromErr(fmt.Errorf("error setting `idp_id` for federatedSettings IdentityProviders: %s", err))
348352
}
349353

354+
if err := d.Set("idp_type", federatedSettingsIdentityProvider.IdpType); err != nil {
355+
return diag.FromErr(fmt.Errorf("error setting `idp_type` for federatedSettings IdentityProviders: %s", err))
356+
}
357+
350358
d.SetId(federatedSettingsIdentityProvider.Id)
351359

352360
return nil

internal/service/federatedsettingsidentityprovider/data_source_federated_settings_identity_providers.go

+23-2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1212

1313
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/constant"
14+
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion"
1415
"github.com/mongodb/terraform-provider-mongodbatlas/internal/config"
1516
)
1617

@@ -22,6 +23,20 @@ func PluralDataSource() *schema.Resource {
2223
Type: schema.TypeString,
2324
Required: true,
2425
},
26+
"idp_types": {
27+
Type: schema.TypeList,
28+
Elem: &schema.Schema{
29+
Type: schema.TypeString,
30+
},
31+
Optional: true,
32+
},
33+
"protocols": {
34+
Type: schema.TypeList,
35+
Elem: &schema.Schema{
36+
Type: schema.TypeString,
37+
},
38+
Optional: true,
39+
},
2540
"page_num": {
2641
Type: schema.TypeInt,
2742
Optional: true,
@@ -249,6 +264,10 @@ func PluralDataSource() *schema.Resource {
249264
Type: schema.TypeString,
250265
Computed: true,
251266
},
267+
"idp_type": {
268+
Type: schema.TypeString,
269+
Computed: true,
270+
},
252271
},
253272
},
254273
},
@@ -262,11 +281,13 @@ func dataSourcePluralRead(ctx context.Context, d *schema.ResourceData, meta any)
262281
if !federationSettingsIDOk {
263282
return diag.FromErr(errors.New("federation_settings_id must be configured"))
264283
}
284+
idpTypes := conversion.ExpandStringList(d.Get("idp_types").([]any))
285+
protocols := conversion.ExpandStringList(d.Get("protocols").([]any))
265286

266287
params := &admin.ListIdentityProvidersApiParams{
267288
FederationSettingsId: federationSettingsID.(string),
268-
Protocol: &[]string{OIDC, SAML},
269-
IdpType: &[]string{WORKFORCE},
289+
Protocol: &protocols,
290+
IdpType: &idpTypes,
270291
}
271292

272293
providers, _, err := connV2.FederatedAuthenticationApi.ListIdentityProvidersWithParams(ctx, params).Execute()

internal/service/federatedsettingsidentityprovider/data_source_federated_settings_identity_providers_test.go

+49-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"testing"
77

88
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
9+
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion"
10+
"github.com/mongodb/terraform-provider-mongodbatlas/internal/service/federatedsettingsidentityprovider"
911
"github.com/mongodb/terraform-provider-mongodbatlas/internal/testutil/acc"
1012
)
1113

@@ -20,22 +22,66 @@ func TestAccFederatedSettingsIdentityProvidersDS_basic(t *testing.T) {
2022
ProtoV6ProviderFactories: acc.TestAccProviderV6Factories,
2123
Steps: []resource.TestStep{
2224
{
23-
Config: configBasicPluralDS(federatedSettingsID),
25+
Config: configPluralDS(federatedSettingsID, conversion.StringPtr(federatedsettingsidentityprovider.WORKFORCE), []string{oidcProtocol, samlProtocol}),
2426
Check: resource.ComposeTestCheckFunc(
2527
resource.TestCheckResourceAttrSet(dataSourceName, "federation_settings_id"),
2628
resource.TestCheckResourceAttr(dataSourceName, "results.#", "2"),
2729
),
2830
},
31+
{
32+
Config: configPluralDS(federatedSettingsID, conversion.StringPtr(federatedsettingsidentityprovider.WORKFORCE), []string{samlProtocol}),
33+
Check: resource.ComposeTestCheckFunc(
34+
resource.TestCheckResourceAttrSet(dataSourceName, "federation_settings_id"),
35+
resource.TestCheckResourceAttr(dataSourceName, "results.#", "1"),
36+
resource.TestCheckResourceAttr(dataSourceName, "results.0.display_name", "SAML-test"),
37+
),
38+
},
39+
{
40+
Config: configPluralDS(federatedSettingsID, conversion.StringPtr(federatedsettingsidentityprovider.WORKFORCE), []string{oidcProtocol}),
41+
Check: resource.ComposeTestCheckFunc(
42+
resource.TestCheckResourceAttrSet(dataSourceName, "federation_settings_id"),
43+
resource.TestCheckResourceAttr(dataSourceName, "results.#", "1"),
44+
resource.TestCheckResourceAttr(dataSourceName, "results.0.display_name", "OIDC-test"),
45+
),
46+
},
47+
{
48+
Config: configPluralDS(federatedSettingsID, conversion.StringPtr(federatedsettingsidentityprovider.WORKFORCE), []string{}),
49+
Check: resource.ComposeTestCheckFunc(
50+
resource.TestCheckResourceAttrSet(dataSourceName, "federation_settings_id"),
51+
resource.TestCheckResourceAttr(dataSourceName, "results.#", "1"),
52+
resource.TestCheckResourceAttr(dataSourceName, "results.0.display_name", "SAML-test"), // if no protocol is specified, it defaults to SAML
53+
),
54+
},
55+
{
56+
Config: configPluralDS(federatedSettingsID, conversion.StringPtr(federatedsettingsidentityprovider.WORKLOAD), []string{}),
57+
Check: resource.ComposeTestCheckFunc(
58+
resource.TestCheckResourceAttrSet(dataSourceName, "federation_settings_id"),
59+
resource.TestCheckResourceAttr(dataSourceName, "results.#", "0"),
60+
),
61+
},
2962
},
3063
})
3164
}
3265

33-
func configBasicPluralDS(federatedSettingsID string) string {
66+
func configPluralDS(federatedSettingsID string, idpType *string, protocols []string) string {
67+
var protocolString string
68+
if len(protocols) > 1 {
69+
protocolString = fmt.Sprintf(`protocols = [%[1]q, %[2]q]`, protocols[0], protocols[1])
70+
} else if len(protocols) > 0 {
71+
protocolString = fmt.Sprintf(`protocols = [%[1]q]`, protocols[0])
72+
}
73+
var idpTypeString string
74+
if idpType != nil {
75+
idpTypeString = fmt.Sprintf(`idp_types = [%[1]q]`, *idpType)
76+
}
77+
3478
return fmt.Sprintf(`
3579
data "mongodbatlas_federated_settings_identity_providers" "test" {
3680
federation_settings_id = "%[1]s"
3781
page_num = 1
3882
items_per_page = 100
83+
%[2]s
84+
%[3]s
3985
}
40-
`, federatedSettingsID)
86+
`, federatedSettingsID, protocolString, idpTypeString)
4187
}

internal/service/federatedsettingsidentityprovider/model_federated_settings_identity_provider.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
)
1313

1414
const WORKFORCE = "WORKFORCE"
15+
const WORKLOAD = "WORKLOAD"
1516

1617
func ExpandIdentityProviderOIDCCreate(d *schema.ResourceData) *admin.FederationOidcIdentityProviderUpdate {
1718
return &admin.FederationOidcIdentityProviderUpdate{
@@ -22,7 +23,7 @@ func ExpandIdentityProviderOIDCCreate(d *schema.ResourceData) *admin.FederationO
2223
Description: conversion.StringPtr(d.Get("description").(string)),
2324
DisplayName: conversion.StringPtr(d.Get("name").(string)),
2425
GroupsClaim: conversion.StringPtr(d.Get("groups_claim").(string)),
25-
IdpType: conversion.StringPtr(WORKFORCE),
26+
IdpType: conversion.StringPtr(d.Get("idp_type").(string)),
2627
IssuerUri: conversion.StringPtr(d.Get("issuer_uri").(string)),
2728
Protocol: conversion.StringPtr(d.Get("protocol").(string)),
2829
RequestedScopes: expandRequestedScopes(d),
@@ -100,6 +101,7 @@ func FlattenFederatedSettingsIdentityProvider(federatedSettingsIdentityProvider
100101
"user_claim": federatedSettingsIdentityProvider[i].UserClaim,
101102
"authorization_type": federatedSettingsIdentityProvider[i].AuthorizationType,
102103
"description": federatedSettingsIdentityProvider[i].Description,
104+
"idp_type": federatedSettingsIdentityProvider[i].IdpType,
103105
}
104106
}
105107
}

internal/service/federatedsettingsidentityprovider/model_federated_settings_identity_provider_test.go

+4
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ func TestFlattenFederatedSettingsIdentityProvider(t *testing.T) {
338338
AssociatedOrgs: &associatedOrgs,
339339
AudienceUri: &audienceURI,
340340
DisplayName: &displayName,
341+
IdpType: conversion.StringPtr(federatedsettingsidentityprovider.WORKFORCE),
341342
IssuerUri: &issuerURI,
342343
OktaIdpId: oktaIdpID,
343344
PemFileInfo: &pemFileInfo,
@@ -375,6 +376,7 @@ func TestFlattenFederatedSettingsIdentityProvider(t *testing.T) {
375376
"user_claim": nilStringPtr,
376377
"description": &description,
377378
"authorization_type": nilStringPtr,
379+
"idp_type": conversion.StringPtr(federatedsettingsidentityprovider.WORKFORCE),
378380
},
379381
},
380382
},
@@ -395,6 +397,7 @@ func TestFlattenFederatedSettingsIdentityProvider(t *testing.T) {
395397
UserClaim: &userClaim,
396398
Description: &description,
397399
AuthorizationType: &authorizationType,
400+
IdpType: conversion.StringPtr(federatedsettingsidentityprovider.WORKFORCE),
398401
},
399402
},
400403
output: []map[string]any{
@@ -421,6 +424,7 @@ func TestFlattenFederatedSettingsIdentityProvider(t *testing.T) {
421424
"user_claim": &userClaim,
422425
"description": &description,
423426
"authorization_type": &authorizationType,
427+
"idp_type": conversion.StringPtr(federatedsettingsidentityprovider.WORKFORCE),
424428
},
425429
},
426430
},

internal/service/federatedsettingsidentityprovider/resource_federated_settings_identity_provider.go

+16-1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,11 @@ func Resource() *schema.Resource {
111111
Type: schema.TypeString,
112112
Optional: true,
113113
},
114+
"idp_type": {
115+
Type: schema.TypeString,
116+
Optional: true, // Required for OIDC IdPs
117+
Computed: true, // If not set for SAML IdPs, it will return WORKFORCE
118+
},
114119
},
115120
}
116121
}
@@ -230,6 +235,9 @@ func resourceRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Di
230235
if err := d.Set("authorization_type", federatedSettingsIdentityProvider.AuthorizationType); err != nil {
231236
return diag.FromErr(fmt.Errorf("error setting authorization_type (%s): %s", d.Id(), err))
232237
}
238+
if err := d.Set("idp_type", federatedSettingsIdentityProvider.IdpType); err != nil {
239+
return diag.FromErr(fmt.Errorf("error setting idp_type (%s): %s", d.Id(), err))
240+
}
233241

234242
d.SetId(encodeStateID(federationSettingsID, federatedSettingsIdentityProvider.Id))
235243

@@ -312,10 +320,17 @@ func resourceUpdate(ctx context.Context, d *schema.ResourceData, meta any) diag.
312320
if d.HasChange("authorization_type") {
313321
updateRequest.AuthorizationType = conversion.StringPtr(d.Get("authorization_type").(string))
314322
}
323+
if d.HasChange("idp_type") {
324+
updateRequest.IdpType = conversion.StringPtr(d.Get("idp_type").(string))
325+
}
315326

316327
if d.HasChange("groups_claim") {
317328
groupsClaim := d.Get("groups_claim").(string)
318-
updateRequest.GroupsClaim = &groupsClaim
329+
if groupsClaim == "" {
330+
updateRequest.GroupsClaim = nil
331+
} else {
332+
updateRequest.GroupsClaim = &groupsClaim
333+
}
319334
}
320335

321336
if d.HasChange("requested_scopes") {

0 commit comments

Comments
 (0)