Skip to content

Commit 0543daf

Browse files
modular-magiciandanawillow
authored andcommitted
fix permadiff with new access approval cloud product mappings (#4065) (#2565)
Signed-off-by: Modular Magician <[email protected]>
1 parent 8f9bed0 commit 0543daf

6 files changed

+80
-27
lines changed

.changelog/4065.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:bug
2+
accessapproval: fixed issue where, due to a recent API change, `google_*_access_approval.enrolled_services.cloud_product` entries specified as a URL would result in a permadiff
3+
```

google-beta/resource_access_approval_folder_settings.go

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package google
1616

1717
import (
18+
"bytes"
1819
"fmt"
1920
"log"
2021
"reflect"
@@ -25,6 +26,30 @@ import (
2526
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
2627
)
2728

29+
var accessApprovalCloudProductMapping = map[string]string{
30+
"appengine.googleapis.com": "App Engine",
31+
"bigquery.googleapis.com": "BigQuery",
32+
"bigtable.googleapis.com": "Cloud Bigtable",
33+
"cloudkms.googleapis.com": "Cloud Key Management Service",
34+
"compute.googleapis.com": "Compute Engine",
35+
"dataflow.googleapis.com": "Cloud Dataflow",
36+
"iam.googleapis.com": "Cloud Identity and Access Management",
37+
"pubsub.googleapis.com": "Cloud Pub/Sub",
38+
"storage.googleapis.com": "Cloud Storage",
39+
}
40+
41+
func accessApprovalEnrolledServicesHash(v interface{}) int {
42+
var buf bytes.Buffer
43+
m := v.(map[string]interface{})
44+
cp := m["cloud_product"].(string)
45+
if n, ok := accessApprovalCloudProductMapping[cp]; ok {
46+
cp = n
47+
}
48+
buf.WriteString(fmt.Sprintf("%s-", strings.ToLower(cp))) // ToLower just in case
49+
buf.WriteString(fmt.Sprintf("%s-", strings.ToLower(m["enrollment_level"].(string))))
50+
return hashcode(buf.String())
51+
}
52+
2853
func resourceAccessApprovalFolderSettings() *schema.Resource {
2954
return &schema.Resource{
3055
Create: resourceAccessApprovalFolderSettingsCreate,
@@ -52,7 +77,7 @@ to have explicit approval. Enrollment can only be done on an all or nothing basi
5277
5378
A maximum of 10 enrolled services will be enforced, to be expanded as the set of supported services is expanded.`,
5479
Elem: accessapprovalFolderSettingsEnrolledServicesSchema(),
55-
// Default schema.HashSchema is used.
80+
Set: accessApprovalEnrolledServicesHash,
5681
},
5782
"folder_id": {
5883
Type: schema.TypeString,
@@ -94,16 +119,29 @@ func accessapprovalFolderSettingsEnrolledServicesSchema() *schema.Resource {
94119
Type: schema.TypeString,
95120
Required: true,
96121
Description: `The product for which Access Approval will be enrolled. Allowed values are listed (case-sensitive):
97-
all
98-
appengine.googleapis.com
99-
bigquery.googleapis.com
100-
bigtable.googleapis.com
101-
cloudkms.googleapis.com
102-
compute.googleapis.com
103-
dataflow.googleapis.com
104-
iam.googleapis.com
105-
pubsub.googleapis.com
106-
storage.googleapis.com`,
122+
* all
123+
* App Engine
124+
* BigQuery
125+
* Cloud Bigtable
126+
* Cloud Key Management Service
127+
* Compute Engine
128+
* Cloud Dataflow
129+
* Cloud Identity and Access Management
130+
* Cloud Pub/Sub
131+
* Cloud Storage
132+
* Persistent Disk
133+
134+
Note: These values are supported as input, but considered a legacy format:
135+
* all
136+
* appengine.googleapis.com
137+
* bigquery.googleapis.com
138+
* bigtable.googleapis.com
139+
* cloudkms.googleapis.com
140+
* compute.googleapis.com
141+
* dataflow.googleapis.com
142+
* iam.googleapis.com
143+
* pubsub.googleapis.com
144+
* storage.googleapis.com`,
107145
},
108146
"enrollment_level": {
109147
Type: schema.TypeString,
@@ -363,7 +401,7 @@ func flattenAccessApprovalFolderSettingsEnrolledServices(v interface{}, d *schem
363401
return v
364402
}
365403
l := v.([]interface{})
366-
transformed := schema.NewSet(schema.HashResource(accessapprovalFolderSettingsEnrolledServicesSchema()), []interface{}{})
404+
transformed := schema.NewSet(accessApprovalEnrolledServicesHash, []interface{}{})
367405
for _, raw := range l {
368406
original := raw.(map[string]interface{})
369407
if len(original) < 1 {

google-beta/resource_access_approval_organization_settings.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ to have explicit approval. Enrollment can be done for individual services.
5252
5353
A maximum of 10 enrolled services will be enforced, to be expanded as the set of supported services is expanded.`,
5454
Elem: accessapprovalOrganizationSettingsEnrolledServicesSchema(),
55-
// Default schema.HashSchema is used.
55+
Set: accessApprovalEnrolledServicesHash,
5656
},
5757
"organization_id": {
5858
Type: schema.TypeString,
@@ -363,7 +363,7 @@ func flattenAccessApprovalOrganizationSettingsEnrolledServices(v interface{}, d
363363
return v
364364
}
365365
l := v.([]interface{})
366-
transformed := schema.NewSet(schema.HashResource(accessapprovalOrganizationSettingsEnrolledServicesSchema()), []interface{}{})
366+
transformed := schema.NewSet(accessApprovalEnrolledServicesHash, []interface{}{})
367367
for _, raw := range l {
368368
original := raw.(map[string]interface{})
369369
if len(original) < 1 {

google-beta/resource_access_approval_organization_settings_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ resource "google_organization_access_approval_settings" "organization_access_app
5151
notification_emails = ["[email protected]"]
5252
5353
enrolled_services {
54-
cloud_product = "appengine.googleapis.com"
54+
cloud_product = "App Engine"
5555
}
5656
5757
enrolled_services {

google-beta/resource_access_approval_project_settings.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ to have explicit approval. Enrollment can only be done on an all or nothing basi
5252
5353
A maximum of 10 enrolled services will be enforced, to be expanded as the set of supported services is expanded.`,
5454
Elem: accessapprovalProjectSettingsEnrolledServicesSchema(),
55-
// Default schema.HashSchema is used.
55+
Set: accessApprovalEnrolledServicesHash,
5656
},
5757
"project_id": {
5858
Type: schema.TypeString,
@@ -391,7 +391,7 @@ func flattenAccessApprovalProjectSettingsEnrolledServices(v interface{}, d *sche
391391
return v
392392
}
393393
l := v.([]interface{})
394-
transformed := schema.NewSet(schema.HashResource(accessapprovalProjectSettingsEnrolledServicesSchema()), []interface{}{})
394+
transformed := schema.NewSet(accessApprovalEnrolledServicesHash, []interface{}{})
395395
for _, raw := range l {
396396
original := raw.(map[string]interface{})
397397
if len(original) < 1 {

website/docs/r/access_approval_folder_settings.html.markdown

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,28 @@ The `enrolled_services` block supports:
7171
* `cloud_product` -
7272
(Required)
7373
The product for which Access Approval will be enrolled. Allowed values are listed (case-sensitive):
74-
all
75-
appengine.googleapis.com
76-
bigquery.googleapis.com
77-
bigtable.googleapis.com
78-
cloudkms.googleapis.com
79-
compute.googleapis.com
80-
dataflow.googleapis.com
81-
iam.googleapis.com
82-
pubsub.googleapis.com
83-
storage.googleapis.com
74+
* all
75+
* App Engine
76+
* BigQuery
77+
* Cloud Bigtable
78+
* Cloud Key Management Service
79+
* Compute Engine
80+
* Cloud Dataflow
81+
* Cloud Identity and Access Management
82+
* Cloud Pub/Sub
83+
* Cloud Storage
84+
* Persistent Disk
85+
Note: These values are supported as input, but considered a legacy format:
86+
* all
87+
* appengine.googleapis.com
88+
* bigquery.googleapis.com
89+
* bigtable.googleapis.com
90+
* cloudkms.googleapis.com
91+
* compute.googleapis.com
92+
* dataflow.googleapis.com
93+
* iam.googleapis.com
94+
* pubsub.googleapis.com
95+
* storage.googleapis.com
8496

8597
* `enrollment_level` -
8698
(Optional)

0 commit comments

Comments
 (0)