Skip to content

Commit 788824d

Browse files
fix(bigquery_dataset): fixed handling of non-legacy roles for access … (#14569) (#23898)
[upstream:dc6120220bbbc7ec562d19e920333441d3093460] Signed-off-by: Modular Magician <[email protected]>
1 parent 4e061da commit 788824d

File tree

4 files changed

+38
-4
lines changed

4 files changed

+38
-4
lines changed

.changelog/14569.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
bigquery: fixed handling of non-legacy roles for access block inside `google_bigquery_dataset`
3+
```

google/services/bigquery/resource_bigquery_dataset.go

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ import (
3838

3939
const datasetIdRegexp = `^[0-9A-Za-z_]+$`
4040

41+
var bigqueryDatasetAccessPrimitiveToRoleMap = map[string]string{
42+
"OWNER": "roles/bigquery.dataOwner",
43+
"WRITER": "roles/bigquery.dataEditor",
44+
"READER": "roles/bigquery.dataViewer",
45+
}
46+
4147
func validateDatasetId(v interface{}, k string) (ws []string, errors []error) {
4248
value := v.(string)
4349
if !regexp.MustCompile(datasetIdRegexp).MatchString(value) {
@@ -62,6 +68,31 @@ func validateDefaultTableExpirationMs(v interface{}, k string) (ws []string, err
6268
return
6369
}
6470

71+
// bigqueryDatasetAccessHash is a custom hash function for the access block.
72+
// It normalizes the 'role' field before hashing, treating legacy roles
73+
// and their modern IAM equivalents as the same.
74+
func resourceBigqueryDatasetAccessHash(v interface{}) int {
75+
m, ok := v.(map[string]interface{})
76+
if !ok {
77+
return 0
78+
}
79+
// Make a copy of the map to avoid modifying the underlying data.
80+
copy := make(map[string]interface{}, len(m))
81+
for k, val := range m {
82+
copy[k] = val
83+
}
84+
85+
// Normalize the role if it exists and matches a legacy role.
86+
if role, ok := copy["role"].(string); ok {
87+
if newRole, ok := bigqueryDatasetAccessPrimitiveToRoleMap[role]; ok {
88+
copy["role"] = newRole
89+
}
90+
}
91+
92+
// Use the default HashResource function on the (potentially modified) copy.
93+
return schema.HashResource(bigqueryDatasetAccessSchema())(copy)
94+
}
95+
6596
func ResourceBigQueryDataset() *schema.Resource {
6697
return &schema.Resource{
6798
Create: resourceBigQueryDatasetCreate,
@@ -101,7 +132,7 @@ underscores (_). The maximum length is 1,024 characters.`,
101132
Optional: true,
102133
Description: `An array of objects that define dataset access for one or more entities.`,
103134
Elem: bigqueryDatasetAccessSchema(),
104-
// Default schema.HashSchema is used.
135+
Set: resourceBigqueryDatasetAccessHash,
105136
},
106137
"default_collation": {
107138
Type: schema.TypeString,
@@ -1034,7 +1065,7 @@ func flattenBigQueryDatasetAccess(v interface{}, d *schema.ResourceData, config
10341065
return v
10351066
}
10361067
l := v.([]interface{})
1037-
transformed := schema.NewSet(schema.HashResource(bigqueryDatasetAccessSchema()), []interface{}{})
1068+
transformed := schema.NewSet(resourceBigqueryDatasetAccessHash, []interface{}{})
10381069
for _, raw := range l {
10391070
original := raw.(map[string]interface{})
10401071
if len(original) < 1 {

google/services/bigquery/resource_bigquery_dataset_generated_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ resource "google_bigquery_dataset" "dataset" {
7070
}
7171
7272
access {
73-
role = "OWNER"
73+
role = "roles/bigquery.dataOwner"
7474
user_by_email = google_service_account.bqowner.email
7575
}
7676

website/docs/r/bigquery_dataset.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ resource "google_bigquery_dataset" "dataset" {
5555
}
5656
5757
access {
58-
role = "OWNER"
58+
role = "roles/bigquery.dataOwner"
5959
user_by_email = google_service_account.bqowner.email
6060
}
6161

0 commit comments

Comments
 (0)