Skip to content

Commit 7d18e25

Browse files
committed
add data source
1 parent ef3a3bd commit 7d18e25

File tree

4 files changed

+242
-0
lines changed

4 files changed

+242
-0
lines changed

ovh/data_me_identity_provider.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package ovh
2+
3+
import (
4+
"context"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
)
9+
10+
func dataSourceMeIdentityProvider() *schema.Resource {
11+
return &schema.Resource{
12+
ReadContext: dataSourceMeIdentityProviderRead,
13+
14+
Schema: map[string]*schema.Schema{
15+
"group_attribute_name": {
16+
Type: schema.TypeString,
17+
Computed: true,
18+
},
19+
"requested_attributes": {
20+
Type: schema.TypeList,
21+
Computed: true,
22+
Elem: &schema.Resource{
23+
Schema: map[string]*schema.Schema{
24+
"is_required": {
25+
Type: schema.TypeBool,
26+
Computed: true,
27+
},
28+
"name": {
29+
Type: schema.TypeString,
30+
Computed: true,
31+
},
32+
"name_format": {
33+
Type: schema.TypeString,
34+
Computed: true,
35+
},
36+
"values": {
37+
Type: schema.TypeList,
38+
Elem: &schema.Schema{
39+
Type: schema.TypeString,
40+
},
41+
Computed: true,
42+
},
43+
},
44+
},
45+
},
46+
"idp_signing_certificates": {
47+
Type: schema.TypeList,
48+
Computed: true,
49+
Elem: &schema.Resource{
50+
Schema: map[string]*schema.Schema{
51+
"expiration": {
52+
Type: schema.TypeString,
53+
Computed: true,
54+
},
55+
"subject": {
56+
Type: schema.TypeString,
57+
Computed: true,
58+
},
59+
},
60+
},
61+
},
62+
"sso_service_url": {
63+
Type: schema.TypeString,
64+
Computed: true,
65+
},
66+
"user_attribute_name": {
67+
Type: schema.TypeString,
68+
Computed: true,
69+
},
70+
"disable_users": {
71+
Type: schema.TypeBool,
72+
Computed: true,
73+
},
74+
"creation": {
75+
Type: schema.TypeString,
76+
Computed: true,
77+
},
78+
"last_update": {
79+
Type: schema.TypeString,
80+
Computed: true,
81+
},
82+
},
83+
}
84+
}
85+
86+
func dataSourceMeIdentityProviderRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
87+
config := meta.(*Config)
88+
89+
providerConfDetails := &MeIdentityProviderResponse{}
90+
if err := config.OVHClient.GetWithContext(ctx, "/me/identity/provider", providerConfDetails); err != nil {
91+
return diag.FromErr(err)
92+
}
93+
94+
d.SetId("ovh_sso")
95+
d.Set("group_attribute_name", providerConfDetails.GroupAttributeName)
96+
d.Set("disable_users", providerConfDetails.DisableUsers)
97+
d.Set("requested_attributes", requestedAttributesToMapList(providerConfDetails.Extensions.RequestedAttributes))
98+
d.Set("idp_signing_certificates", idpSigningCertificatesToMapList(providerConfDetails.IdpSigningCertificates))
99+
d.Set("sso_service_url", providerConfDetails.SsoServiceUrl)
100+
d.Set("user_attribute_name", providerConfDetails.UserAttributeName)
101+
d.Set("creation", providerConfDetails.Creation)
102+
d.Set("last_update", providerConfDetails.LastUpdate)
103+
104+
return nil
105+
}
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func TestAccMeIdentityProviderDataSource_basic(t *testing.T) {
11+
groupAttributeName := "http://schemas.xmlsoap.org/claims/Group"
12+
disableUsers := "false"
13+
reqAttributeRequired := "false"
14+
reqAttributeName := "identity"
15+
reqAttributeNameFormat := "urn:oasis:names:tc:SAML:2.0:attrname-format:basic"
16+
reqAttributeValue := "foobar"
17+
18+
preSetup := fmt.Sprintf(
19+
testAccMeIdentityProviderDataSourceConfig_preSetup,
20+
groupAttributeName,
21+
samlIDPMetadata,
22+
disableUsers,
23+
reqAttributeRequired,
24+
reqAttributeName,
25+
reqAttributeNameFormat,
26+
reqAttributeValue,
27+
)
28+
config := fmt.Sprintf(
29+
testAccMeIdentityProviderDataSourceConfig_keys,
30+
groupAttributeName,
31+
samlIDPMetadata,
32+
disableUsers,
33+
reqAttributeRequired,
34+
reqAttributeName,
35+
reqAttributeNameFormat,
36+
reqAttributeValue,
37+
)
38+
39+
userAttributeName := "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"
40+
ssoServiceUrl := "https://ovhcloud.com/"
41+
certificateExpiration := "2033-11-06T10:06:24Z"
42+
certificateSubject := "CN=ovhcloud.com,O=OVHcloud,L=RBX,ST=Some-State,C=FR"
43+
44+
requestedAttributes := map[string]string{
45+
"is_required": reqAttributeRequired,
46+
"name": reqAttributeName,
47+
"name_format": reqAttributeNameFormat,
48+
"values": reqAttributeValue,
49+
}
50+
51+
checks := checkIdentityProviderResourceAttr("ovh_me_identity_provider.sso", groupAttributeName, disableUsers, samlIDPMetadata, requestedAttributes)
52+
dataSourceChecks := checkIdentityProviderDataSourceAttr("data.ovh_me_identity_provider.sso", groupAttributeName, userAttributeName, ssoServiceUrl, disableUsers, certificateExpiration, certificateSubject, requestedAttributes)
53+
dataSourceChecks = append(dataSourceChecks, resource.TestCheckOutput("keys_present", "true"))
54+
55+
resource.Test(t, resource.TestCase{
56+
PreCheck: func() { testAccPreCheckCredentials(t) },
57+
Providers: testAccProviders,
58+
Steps: []resource.TestStep{
59+
{
60+
Config: preSetup,
61+
Check: resource.ComposeTestCheckFunc(checks...),
62+
}, {
63+
Config: config,
64+
Check: resource.ComposeTestCheckFunc(dataSourceChecks...),
65+
},
66+
},
67+
})
68+
}
69+
70+
func checkIdentityProviderDataSourceAttr(name, group_attribute, user_attribute, sso_service_url, disable_users, certificateExpiration, certificateSubject string, requestedAttributes map[string]string) []resource.TestCheckFunc {
71+
checks := []resource.TestCheckFunc{}
72+
checks = append(checks, resource.TestCheckResourceAttr(name, "group_attribute_name", group_attribute))
73+
checks = append(checks, resource.TestCheckResourceAttr(name, "user_attribute_name", user_attribute))
74+
checks = append(checks, resource.TestCheckResourceAttr(name, "sso_service_url", sso_service_url))
75+
checks = append(checks, resource.TestCheckResourceAttr(name, "disable_users", disable_users))
76+
checks = append(checks, resource.TestCheckResourceAttr(name, "idp_signing_certificates.0.expiration", certificateExpiration))
77+
checks = append(checks, resource.TestCheckResourceAttr(name, "idp_signing_certificates.0.subject", certificateSubject))
78+
if requestedAttributes != nil {
79+
checks = append(checks, resource.TestCheckResourceAttr(name, "requested_attributes.0.is_required", requestedAttributes["is_required"]))
80+
checks = append(checks, resource.TestCheckResourceAttr(name, "requested_attributes.0.name", requestedAttributes["name"]))
81+
checks = append(checks, resource.TestCheckResourceAttr(name, "requested_attributes.0.name_format", requestedAttributes["name_format"]))
82+
checks = append(checks, resource.TestCheckResourceAttr(name, "requested_attributes.0.values.0", requestedAttributes["values"]))
83+
}
84+
return checks
85+
}
86+
87+
const testAccMeIdentityProviderDataSourceConfig_preSetup = `
88+
resource "ovh_me_identity_provider" "sso" {
89+
group_attribute_name = "%s"
90+
metadata = <<EOT
91+
%s
92+
EOT
93+
disable_users = %s
94+
requested_attributes {
95+
is_required = %s
96+
name = "%s"
97+
name_format = "%s"
98+
values = ["%s"]
99+
}
100+
}`
101+
102+
const testAccMeIdentityProviderDataSourceConfig_keys = `
103+
resource "ovh_me_identity_provider" "sso" {
104+
group_attribute_name = "%s"
105+
metadata = <<EOT
106+
%s
107+
EOT
108+
disable_users = %s
109+
requested_attributes {
110+
is_required = %s
111+
name = "%s"
112+
name_format = "%s"
113+
values = ["%s"]
114+
}
115+
}
116+
117+
data "ovh_me_identity_provider" "sso" {}
118+
119+
output "keys_present" {
120+
value = tostring(
121+
data.ovh_me_identity_provider.sso.group_attribute_name == ovh_me_identity_provider.sso.group_attribute_name &&
122+
data.ovh_me_identity_provider.sso.requested_attributes.0.name == ovh_me_identity_provider.sso.requested_attributes.0.name
123+
)
124+
}
125+
`

ovh/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ func Provider() *schema.Provider {
124124
"ovh_me_api_oauth2_clients": dataSourceMeApiOauth2Clients(),
125125
"ovh_me_identity_group": dataSourceMeIdentityGroup(),
126126
"ovh_me_identity_groups": dataSourceMeIdentityGroups(),
127+
"ovh_me_identity_provider": dataSourceMeIdentityProvider(),
127128
"ovh_me_identity_user": dataSourceMeIdentityUser(),
128129
"ovh_me_identity_users": dataSourceMeIdentityUsers(),
129130
"ovh_me_installation_template": dataSourceMeInstallationTemplate(),

ovh/types_me.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,3 +351,14 @@ func requestedAttributesToMapList(attributes []MeIdentityProviderAttribute) []ma
351351
return requestedAttributes
352352
}
353353

354+
// idpSigningCertificatesToMapList transforms an array of MeIdentityProviderIDPCertificates to an array of map
355+
func idpSigningCertificatesToMapList(idpSigningCertificates []MeIdentityProviderIDPCertificates) []map[string]interface{} {
356+
certificates := []map[string]interface{}{}
357+
for _, v := range idpSigningCertificates {
358+
certificates = append(certificates, map[string]interface{}{
359+
"expiration": v.Expiration,
360+
"subject": v.Subject,
361+
})
362+
}
363+
return certificates
364+
}

0 commit comments

Comments
 (0)