Skip to content

Commit 47cdaec

Browse files
Support policy version 3 in google_spanner_database_iam_member and google_spanner_instance_iam_member (#6915) (#13556)
* support policy version 3 in spanner_database_iam and spanner_instance_iam resources * re-trigger checks * update tests to have conditions * fix tests * fix tests Signed-off-by: Modular Magician <[email protected]> Signed-off-by: Modular Magician <[email protected]>
1 parent d52c3c8 commit 47cdaec

5 files changed

+31
-6
lines changed

.changelog/6915.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
spanner: added support for IAM conditions with `google_spanner_database_iam_member` and `google_spanner_instance_iam_member`
3+
```

google/iam_spanner_database.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ func (u *SpannerDatabaseIamUpdater) GetResourceIamPolicy() (*cloudresourcemanage
6666
Project: u.project,
6767
Database: u.database,
6868
Instance: u.instance,
69-
}.databaseUri(), &spanner.GetIamPolicyRequest{}).Do()
69+
}.databaseUri(), &spanner.GetIamPolicyRequest{
70+
Options: &spanner.GetPolicyOptions{RequestedPolicyVersion: iamPolicyVersion},
71+
}).Do()
7072

7173
if err != nil {
7274
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
@@ -78,6 +80,8 @@ func (u *SpannerDatabaseIamUpdater) GetResourceIamPolicy() (*cloudresourcemanage
7880
return nil, errwrap.Wrapf(fmt.Sprintf("Invalid IAM policy for %s: {{err}}", u.DescribeResource()), err)
7981
}
8082

83+
cloudResourcePolicy.Version = iamPolicyVersion
84+
8185
return cloudResourcePolicy, nil
8286
}
8387

@@ -88,6 +92,8 @@ func (u *SpannerDatabaseIamUpdater) SetResourceIamPolicy(policy *cloudresourcema
8892
return errwrap.Wrapf(fmt.Sprintf("Invalid IAM policy for %s: {{err}}", u.DescribeResource()), err)
8993
}
9094

95+
spannerPolicy.Version = iamPolicyVersion
96+
9197
userAgent, err := generateUserAgentString(u.d, u.Config.userAgent)
9298
if err != nil {
9399
return err

google/iam_spanner_instance.go

+7-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ func (u *SpannerInstanceIamUpdater) GetResourceIamPolicy() (*cloudresourcemanage
7373
p, err := u.Config.NewSpannerClient(userAgent).Projects.Instances.GetIamPolicy(spannerInstanceId{
7474
Project: u.project,
7575
Instance: u.instance,
76-
}.instanceUri(), &spanner.GetIamPolicyRequest{}).Do()
76+
}.instanceUri(), &spanner.GetIamPolicyRequest{
77+
Options: &spanner.GetPolicyOptions{RequestedPolicyVersion: iamPolicyVersion},
78+
}).Do()
7779

7880
if err != nil {
7981
return nil, errwrap.Wrapf(fmt.Sprintf("Error retrieving IAM policy for %s: {{err}}", u.DescribeResource()), err)
@@ -85,6 +87,8 @@ func (u *SpannerInstanceIamUpdater) GetResourceIamPolicy() (*cloudresourcemanage
8587
return nil, errwrap.Wrapf(fmt.Sprintf("Invalid IAM policy for %s: {{err}}", u.DescribeResource()), err)
8688
}
8789

90+
cloudResourcePolicy.Version = iamPolicyVersion
91+
8892
return cloudResourcePolicy, nil
8993
}
9094

@@ -95,6 +99,8 @@ func (u *SpannerInstanceIamUpdater) SetResourceIamPolicy(policy *cloudresourcema
9599
return errwrap.Wrapf(fmt.Sprintf("Invalid IAM policy for %s: {{err}}", u.DescribeResource()), err)
96100
}
97101

102+
spannerPolicy.Version = iamPolicyVersion
103+
98104
userAgent, err := generateUserAgentString(u.d, u.Config.userAgent)
99105
if err != nil {
100106
return err

google/resource_spanner_database_iam_test.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func TestAccSpannerDatabaseIamMember(t *testing.T) {
5959
role := "roles/spanner.databaseAdmin"
6060
database := fmt.Sprintf("tf-test-%s", randString(t, 10))
6161
instance := fmt.Sprintf("tf-test-%s", randString(t, 10))
62+
conditionTitle := "Access only database one"
6263

6364
vcrTest(t, resource.TestCase{
6465
PreCheck: func() { testAccPreCheck(t) },
@@ -70,11 +71,11 @@ func TestAccSpannerDatabaseIamMember(t *testing.T) {
7071
},
7172
{
7273
ResourceName: "google_spanner_database_iam_member.foo",
73-
ImportStateId: fmt.Sprintf("%s %s serviceAccount:%s@%s.iam.gserviceaccount.com", spannerDatabaseId{
74+
ImportStateId: fmt.Sprintf("%s %s serviceAccount:%s@%s.iam.gserviceaccount.com %s", spannerDatabaseId{
7475
Instance: instance,
7576
Database: database,
7677
Project: project,
77-
}.terraformId(), role, account, project),
78+
}.terraformId(), role, account, project, conditionTitle),
7879
ImportState: true,
7980
ImportStateVerify: true,
8081
},
@@ -207,6 +208,10 @@ resource "google_spanner_database_iam_member" "foo" {
207208
instance = google_spanner_database.database.instance
208209
role = "%s"
209210
member = "serviceAccount:${google_service_account.test_account.email}"
211+
condition {
212+
title = "Access only database one"
213+
expression = "resource.type == \"spanner.googleapis.com/DatabaseRole\" && resource.name.endsWith(\"/databaseRoles/parent\")"
214+
}
210215
}
211216
`, account, instance, instance, database, roleId)
212217
}

google/resource_spanner_instance_iam_test.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func TestAccSpannerInstanceIamMember(t *testing.T) {
5555
account := fmt.Sprintf("tf-test-%d", randInt(t))
5656
role := "roles/spanner.databaseAdmin"
5757
instance := fmt.Sprintf("tf-test-%s", randString(t, 10))
58+
conditionTitle := "Access only database one"
5859

5960
vcrTest(t, resource.TestCase{
6061
PreCheck: func() { testAccPreCheck(t) },
@@ -66,10 +67,10 @@ func TestAccSpannerInstanceIamMember(t *testing.T) {
6667
},
6768
{
6869
ResourceName: "google_spanner_instance_iam_member.foo",
69-
ImportStateId: fmt.Sprintf("%s %s serviceAccount:%s@%s.iam.gserviceaccount.com", spannerInstanceId{
70+
ImportStateId: fmt.Sprintf("%s %s serviceAccount:%s@%s.iam.gserviceaccount.com %s", spannerInstanceId{
7071
Instance: instance,
7172
Project: project,
72-
}.terraformId(), role, account, project),
73+
}.terraformId(), role, account, project, conditionTitle),
7374
ImportState: true,
7475
ImportStateVerify: true,
7576
},
@@ -179,6 +180,10 @@ resource "google_spanner_instance_iam_member" "foo" {
179180
instance = google_spanner_instance.instance.name
180181
role = "%s"
181182
member = "serviceAccount:${google_service_account.test_account.email}"
183+
condition {
184+
title = "Access only database one"
185+
expression = "resource.type == \"spanner.googleapis.com/DatabaseRole\" && resource.name.endsWith(\"/databaseRoles/parent\")"
186+
}
182187
}
183188
`, account, instance, instance, roleId)
184189
}

0 commit comments

Comments
 (0)