Skip to content

Commit 9a24e00

Browse files
kilokahnafedorch
authored andcommitted
Support identity provider groups and user capabilities
1 parent d7c9573 commit 9a24e00

22 files changed

+872
-13
lines changed

CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
## 3.10.1 (Unreleased)
22

33
### Added
4-
- Support for importing tag. Note tag uses custom Id(import only) format (tagNamespaces/{tagNamespaceId}/tags/{tagName}) to support import.
54
- Support for tagging in `oci_dns_zone`
65
- New attribute `nameservers` is added to `oci_dns_zone`
76
- Support for in-transit encryption for paravirtualized boot and data attachment
87
- Identify latest database version with `oci_databse_db_versions` data source using `is_latest_for_major_version` property
8+
- Support for importing tag. Note tag uses custom Id(import only) format (tagNamespaces/{tagNamespaceId}/tags/{tagName}) to support import.
9+
- Support for provisioning user capabilities for native and federation shadow users
10+
- Support `id` attribute for `oci_identity_availability_domains`
11+
- Support `freeform_attributes` attribute for the `oci_identity_identity_provider`
912

1013
## 3.10.0 (December 11, 2018)
1114

docs/examples/identity/user.tf

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,22 @@ resource "oci_identity_user" "user1" {
88
compartment_id = "${var.tenancy_ocid}"
99
}
1010

11+
// Use the "user2" to have non-default values of capabilities without corresponding authentication resources being actually created
12+
resource "oci_identity_user" "user2" {
13+
name = "tf-example-user2"
14+
description = "user2 created by terraform"
15+
compartment_id = "${var.tenancy_ocid}"
16+
}
17+
18+
resource "oci_identity_user_capabilities_management" "user2-capabilities-management" {
19+
user_id = "${oci_identity_user.user2.id}"
20+
can_use_api_keys = "false"
21+
can_use_auth_tokens = "false"
22+
can_use_console_password = "false"
23+
can_use_customer_secret_keys = "false"
24+
can_use_smtp_credentials = "false"
25+
}
26+
1127
data "oci_identity_users" "users1" {
1228
compartment_id = "${oci_identity_user.user1.compartment_id}"
1329

@@ -17,10 +33,23 @@ data "oci_identity_users" "users1" {
1733
}
1834
}
1935

36+
data "oci_identity_users" "users2" {
37+
compartment_id = "${oci_identity_user.user1.compartment_id}"
38+
39+
filter {
40+
name = "id"
41+
values = ["${oci_identity_user.user2.id}"]
42+
}
43+
}
44+
2045
output "users1" {
2146
value = "${data.oci_identity_users.users1.users}"
2247
}
2348

49+
output "users2" {
50+
value = "${data.oci_identity_users.users2.users}"
51+
}
52+
2453
resource "oci_identity_ui_password" "password1" {
2554
user_id = "${oci_identity_user.user1.id}"
2655
}

oci/identity_availability_domains_data_source.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ func AvailabilityDomainsDataSource() *schema.Resource {
3232
Type: schema.TypeString,
3333
Computed: true,
3434
},
35+
"id": {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
},
3539
"name": {
3640
Type: schema.TypeString,
3741
Computed: true,
@@ -93,6 +97,10 @@ func (s *AvailabilityDomainsDataSourceCrud) SetData() error {
9397
"compartment_id": *r.CompartmentId,
9498
}
9599

100+
if r.Id != nil {
101+
availabilityDomain["id"] = *r.Id
102+
}
103+
96104
if r.Name != nil {
97105
availabilityDomain["name"] = *r.Name
98106
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
2+
3+
package provider
4+
5+
import (
6+
"fmt"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform/helper/resource"
10+
"github.com/hashicorp/terraform/terraform"
11+
)
12+
13+
var (
14+
identityProviderGroupDataSourceRepresentation = map[string]interface{}{
15+
"identity_provider_id": Representation{repType: Required, create: `${oci_identity_identity_provider.test_identity_provider.id}`},
16+
}
17+
18+
IdentityProviderGroupResourceConfig = IdentityProviderRequiredOnlyResource
19+
)
20+
21+
func TestIdentityIdentityProviderGroupResource_basic(t *testing.T) {
22+
provider := testAccProvider
23+
config := testProviderConfig()
24+
25+
compartmentId := getEnvSettingWithBlankDefault("compartment_ocid")
26+
compartmentIdVariableStr := fmt.Sprintf("variable \"compartment_id\" { default = \"%s\" }\n", compartmentId)
27+
28+
datasourceName := "data.oci_identity_identity_provider_groups.test_identity_provider_groups"
29+
30+
resource.Test(t, resource.TestCase{
31+
PreCheck: func() { testAccPreCheck(t) },
32+
Providers: map[string]terraform.ResourceProvider{
33+
"oci": provider,
34+
},
35+
Steps: []resource.TestStep{
36+
// verify datasource
37+
{
38+
Config: config +
39+
generateDataSourceFromRepresentationMap("oci_identity_identity_provider_groups", "test_identity_provider_groups", Required, Create, identityProviderGroupDataSourceRepresentation) +
40+
compartmentIdVariableStr + IdentityProviderGroupResourceConfig,
41+
Check: resource.ComposeAggregateTestCheckFunc(
42+
resource.TestCheckResourceAttrSet(datasourceName, "identity_provider_id"),
43+
44+
resource.TestCheckResourceAttrSet(datasourceName, "identity_provider_groups.#"),
45+
),
46+
},
47+
},
48+
})
49+
}
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
// Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
2+
3+
package provider
4+
5+
import (
6+
"context"
7+
8+
"github.com/hashicorp/terraform/helper/schema"
9+
oci_identity "github.com/oracle/oci-go-sdk/identity"
10+
)
11+
12+
func IdentityProviderGroupsDataSource() *schema.Resource {
13+
return &schema.Resource{
14+
Read: readIdentityProviderGroups,
15+
Schema: map[string]*schema.Schema{
16+
"filter": dataSourceFiltersSchema(),
17+
"identity_provider_id": {
18+
Type: schema.TypeString,
19+
Required: true,
20+
},
21+
"identity_provider_groups": {
22+
Type: schema.TypeList,
23+
Computed: true,
24+
Elem: &schema.Resource{
25+
Schema: map[string]*schema.Schema{
26+
// Required
27+
28+
// Optional
29+
30+
// Computed
31+
"display_name": {
32+
Type: schema.TypeString,
33+
Computed: true,
34+
},
35+
"external_identifier": {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
},
39+
"id": {
40+
Type: schema.TypeString,
41+
Computed: true,
42+
},
43+
"identity_provider_id": {
44+
Type: schema.TypeString,
45+
Computed: true,
46+
},
47+
"time_created": {
48+
Type: schema.TypeString,
49+
Computed: true,
50+
},
51+
"time_modified": {
52+
Type: schema.TypeString,
53+
Computed: true,
54+
},
55+
},
56+
},
57+
},
58+
},
59+
}
60+
}
61+
62+
func readIdentityProviderGroups(d *schema.ResourceData, m interface{}) error {
63+
sync := &IdentityProviderGroupsDataSourceCrud{}
64+
sync.D = d
65+
sync.Client = m.(*OracleClients).identityClient
66+
67+
return ReadResource(sync)
68+
}
69+
70+
type IdentityProviderGroupsDataSourceCrud struct {
71+
D *schema.ResourceData
72+
Client *oci_identity.IdentityClient
73+
Res *oci_identity.ListIdentityProviderGroupsResponse
74+
}
75+
76+
func (s *IdentityProviderGroupsDataSourceCrud) VoidState() {
77+
s.D.SetId("")
78+
}
79+
80+
func (s *IdentityProviderGroupsDataSourceCrud) Get() error {
81+
request := oci_identity.ListIdentityProviderGroupsRequest{}
82+
83+
if identityProviderId, ok := s.D.GetOkExists("identity_provider_id"); ok {
84+
tmp := identityProviderId.(string)
85+
request.IdentityProviderId = &tmp
86+
}
87+
88+
request.RequestMetadata.RetryPolicy = getRetryPolicy(false, "identity")
89+
90+
response, err := s.Client.ListIdentityProviderGroups(context.Background(), request)
91+
if err != nil {
92+
return err
93+
}
94+
95+
s.Res = &response
96+
request.Page = s.Res.OpcNextPage
97+
98+
for request.Page != nil {
99+
listResponse, err := s.Client.ListIdentityProviderGroups(context.Background(), request)
100+
if err != nil {
101+
return err
102+
}
103+
104+
s.Res.Items = append(s.Res.Items, listResponse.Items...)
105+
request.Page = listResponse.OpcNextPage
106+
}
107+
108+
return nil
109+
}
110+
111+
func (s *IdentityProviderGroupsDataSourceCrud) SetData() error {
112+
if s.Res == nil {
113+
return nil
114+
}
115+
116+
s.D.SetId(GenerateDataSourceID())
117+
resources := []map[string]interface{}{}
118+
119+
for _, r := range s.Res.Items {
120+
identityProviderGroup := map[string]interface{}{
121+
"identity_provider_id": *r.IdentityProviderId,
122+
}
123+
124+
if r.DisplayName != nil {
125+
identityProviderGroup["display_name"] = *r.DisplayName
126+
}
127+
128+
if r.ExternalIdentifier != nil {
129+
identityProviderGroup["external_identifier"] = *r.ExternalIdentifier
130+
}
131+
132+
if r.Id != nil {
133+
identityProviderGroup["id"] = *r.Id
134+
}
135+
136+
if r.TimeCreated != nil {
137+
identityProviderGroup["time_created"] = r.TimeCreated.String()
138+
}
139+
140+
if r.TimeModified != nil {
141+
identityProviderGroup["time_modified"] = *r.TimeModified
142+
}
143+
144+
resources = append(resources, identityProviderGroup)
145+
}
146+
147+
if f, fOk := s.D.GetOkExists("filter"); fOk {
148+
resources = ApplyFilters(f.(*schema.Set), resources, IdentityProviderGroupsDataSource().Schema["identity_provider_groups"].Elem.(*schema.Resource).Schema)
149+
}
150+
151+
if err := s.D.Set("identity_provider_groups", resources); err != nil {
152+
return err
153+
}
154+
155+
return nil
156+
}

oci/identity_identity_provider_resource.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ func IdentityProviderResource() *schema.Resource {
7171
DiffSuppressFunc: definedTagsDiffSuppressFunction,
7272
Elem: schema.TypeString,
7373
},
74+
"freeform_attributes": {
75+
Type: schema.TypeMap,
76+
Optional: true,
77+
Computed: true,
78+
Elem: schema.TypeString,
79+
},
7480
"freeform_tags": {
7581
Type: schema.TypeMap,
7682
Optional: true,
@@ -242,6 +248,8 @@ func (s *IdentityProviderResourceCrud) SetData() error {
242248
case oci_identity.Saml2IdentityProvider:
243249
s.D.Set("protocol", "SAML2")
244250

251+
s.D.Set("freeform_attributes", v.FreeformAttributes)
252+
245253
if v.MetadataUrl != nil {
246254
s.D.Set("metadata_url", *v.MetadataUrl)
247255
}
@@ -308,6 +316,9 @@ func (s *IdentityProviderResourceCrud) populateTopLevelPolymorphicCreateIdentity
308316
switch strings.ToLower(protocol) {
309317
case strings.ToLower("SAML2"):
310318
details := oci_identity.CreateSaml2IdentityProviderDetails{}
319+
if freeformAttributes, ok := s.D.GetOkExists("freeform_attributes"); ok {
320+
details.FreeformAttributes = objectMapToStringMap(freeformAttributes.(map[string]interface{}))
321+
}
311322
if metadata, ok := s.D.GetOkExists("metadata"); ok {
312323
tmp := metadata.(string)
313324
details.Metadata = &tmp
@@ -360,6 +371,9 @@ func (s *IdentityProviderResourceCrud) populateTopLevelPolymorphicUpdateIdentity
360371
switch strings.ToLower(protocol) {
361372
case strings.ToLower("SAML2"):
362373
details := oci_identity.UpdateSaml2IdentityProviderDetails{}
374+
if freeformAttributes, ok := s.D.GetOkExists("freeform_attributes"); ok {
375+
details.FreeformAttributes = objectMapToStringMap(freeformAttributes.(map[string]interface{}))
376+
}
363377
if metadata, ok := s.D.GetOkExists("metadata"); ok {
364378
tmp := metadata.(string)
365379
details.Metadata = &tmp

oci/identity_identity_provider_test.go

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,16 @@ var (
3737
}
3838

3939
identityProviderRepresentation = map[string]interface{}{
40-
"compartment_id": Representation{repType: Required, create: `${var.tenancy_ocid}`},
41-
"description": Representation{repType: Required, create: `description`, update: `description2`},
42-
"metadata": Representation{repType: Required, create: `${file("${var.identity_provider_metadata_file}")}`, update: `${file("${var.identity_provider_metadata_file}")}`},
43-
"metadata_url": Representation{repType: Required, create: `metadataUrl`, update: `metadataUrl2`},
44-
"name": Representation{repType: Required, create: `test-idp-saml2-adfs`},
45-
"product_type": Representation{repType: Required, create: `ADFS`},
46-
"protocol": Representation{repType: Required, create: `SAML2`},
47-
"defined_tags": Representation{repType: Optional, create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`, update: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue")}`},
48-
"freeform_tags": Representation{repType: Optional, create: map[string]string{"Department": "Finance"}, update: map[string]string{"Department": "Accounting"}},
40+
"compartment_id": Representation{repType: Required, create: `${var.tenancy_ocid}`},
41+
"description": Representation{repType: Required, create: `description`, update: `description2`},
42+
"metadata": Representation{repType: Required, create: `${file("${var.identity_provider_metadata_file}")}`},
43+
"metadata_url": Representation{repType: Required, create: `metadataUrl`, update: `metadataUrl2`},
44+
"name": Representation{repType: Required, create: `test-idp-saml2-adfs`},
45+
"product_type": Representation{repType: Required, create: `ADFS`},
46+
"protocol": Representation{repType: Required, create: `SAML2`},
47+
"defined_tags": Representation{repType: Optional, create: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "value")}`, update: `${map("${oci_identity_tag_namespace.tag-namespace1.name}.${oci_identity_tag.tag1.name}", "updatedValue")}`},
48+
"freeform_attributes": Representation{repType: Optional, create: map[string]string{"clientId": "app_sf3kdjf3"}},
49+
"freeform_tags": Representation{repType: Optional, create: map[string]string{"Department": "Finance"}, update: map[string]string{"Department": "Accounting"}},
4950
}
5051

5152
IdentityProviderResourceDependencies = DefinedTagsDependencies + IdentityProviderPropertyVariables
@@ -115,6 +116,7 @@ func TestIdentityIdentityProviderResource_basic(t *testing.T) {
115116
resource.TestCheckResourceAttr(resourceName, "compartment_id", tenancyId),
116117
resource.TestCheckResourceAttr(resourceName, "defined_tags.%", "1"),
117118
resource.TestCheckResourceAttr(resourceName, "description", "description"),
119+
resource.TestCheckResourceAttr(resourceName, "freeform_attributes.%", "1"),
118120
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
119121
resource.TestCheckResourceAttrSet(resourceName, "id"),
120122
resource.TestCheckResourceAttr(resourceName, "metadata", metadata),
@@ -141,6 +143,7 @@ func TestIdentityIdentityProviderResource_basic(t *testing.T) {
141143
resource.TestCheckResourceAttr(resourceName, "compartment_id", tenancyId),
142144
resource.TestCheckResourceAttr(resourceName, "defined_tags.%", "1"),
143145
resource.TestCheckResourceAttr(resourceName, "description", "description2"),
146+
resource.TestCheckResourceAttr(resourceName, "freeform_attributes.%", "1"),
144147
resource.TestCheckResourceAttr(resourceName, "freeform_tags.%", "1"),
145148
resource.TestCheckResourceAttrSet(resourceName, "id"),
146149
resource.TestCheckResourceAttr(resourceName, "metadata", metadata),
@@ -175,6 +178,7 @@ func TestIdentityIdentityProviderResource_basic(t *testing.T) {
175178
resource.TestCheckResourceAttr(datasourceName, "identity_providers.0.compartment_id", tenancyId),
176179
resource.TestCheckResourceAttr(datasourceName, "identity_providers.0.defined_tags.%", "1"),
177180
resource.TestCheckResourceAttr(datasourceName, "identity_providers.0.description", "description2"),
181+
resource.TestCheckResourceAttr(datasourceName, "identity_providers.0.freeform_attributes.%", "1"),
178182
resource.TestCheckResourceAttr(datasourceName, "identity_providers.0.freeform_tags.%", "1"),
179183
resource.TestCheckResourceAttrSet(datasourceName, "identity_providers.0.id"),
180184
resource.TestCheckResourceAttr(datasourceName, "identity_providers.0.name", "test-idp-saml2-adfs"),

oci/identity_identity_providers_data_source.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ func (s *IdentityProvidersDataSourceCrud) SetData() error {
100100
case oci_identity.Saml2IdentityProvider:
101101
result["protocol"] = "SAML2"
102102

103+
result["freeform_attributes"] = v.FreeformAttributes
104+
103105
if v.MetadataUrl != nil {
104106
result["metadata_url"] = string(*v.MetadataUrl)
105107
}

0 commit comments

Comments
 (0)