Skip to content

Commit 2c40af1

Browse files
Enabling Membership resource to be regionalized with global as default value (#8994) (#16105)
* Adding Terraform resources for Tenancy APIs in GKEHub * Segregating MembershipBinding and MembershipRBACRoleBinding to keep things simpler in the review * Fixing the docu URIs * Adding TF support for Tenancy API for Membership Binding * Adding dependent membership binding to the same commit chain * Making Scope un-updatable and replacing hard coded project number with the one from test env * Making Scope RRBAC updatable * Making Namespace immutable * Adding update test cases * Removing all memberships field from Scope since it is no longer supported * Removing all_memberships field for Scope from all test cases * Enabling Membership resource to be regionalized with global as default value * Moving the test to be the first one in sequence to work-around the IAM test failure * Update mmv1/products/gkehub/Membership.yaml * Adding state migration for gke hub membership * Update mmv1/templates/terraform/examples/gkehub_membership_regional.tf.erb --------- [upstream:bf6b0ee32b7b469a27b4595c695619dcc9f0de5b] Signed-off-by: Modular Magician <[email protected]>
1 parent 3d27370 commit 2c40af1

8 files changed

+271
-53
lines changed

.changelog/8994.txt

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
```release-note:enhancement
2+
gkehub: added `location` field to `google_gke_hub_membership` resource
3+
```
4+
```release-note:enhancement
5+
gkehub: added `location` field to `google_gke_hub_membership_iam_*` resources
6+
```

google/services/gkehub/iam_gke_hub_membership.go

+26-2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ var GKEHubMembershipIamSchema = map[string]*schema.Schema{
3636
Optional: true,
3737
ForceNew: true,
3838
},
39+
"location": {
40+
Type: schema.TypeString,
41+
Computed: true,
42+
Optional: true,
43+
ForceNew: true,
44+
},
3945
"membership_id": {
4046
Type: schema.TypeString,
4147
Required: true,
@@ -46,6 +52,7 @@ var GKEHubMembershipIamSchema = map[string]*schema.Schema{
4652

4753
type GKEHubMembershipIamUpdater struct {
4854
project string
55+
location string
4956
membershipId string
5057
d tpgresource.TerraformResourceData
5158
Config *transport_tpg.Config
@@ -61,6 +68,13 @@ func GKEHubMembershipIamUpdaterProducer(d tpgresource.TerraformResourceData, con
6168
}
6269
}
6370
values["project"] = project
71+
location, _ := tpgresource.GetLocation(d, config)
72+
if location != "" {
73+
if err := d.Set("location", location); err != nil {
74+
return nil, fmt.Errorf("Error setting location: %s", err)
75+
}
76+
}
77+
values["location"] = location
6478
if v, ok := d.GetOk("membership_id"); ok {
6579
values["membership_id"] = v.(string)
6680
}
@@ -77,6 +91,7 @@ func GKEHubMembershipIamUpdaterProducer(d tpgresource.TerraformResourceData, con
7791

7892
u := &GKEHubMembershipIamUpdater{
7993
project: values["project"],
94+
location: values["location"],
8095
membershipId: values["membership_id"],
8196
d: d,
8297
Config: config,
@@ -85,6 +100,9 @@ func GKEHubMembershipIamUpdaterProducer(d tpgresource.TerraformResourceData, con
85100
if err := d.Set("project", u.project); err != nil {
86101
return nil, fmt.Errorf("Error setting project: %s", err)
87102
}
103+
if err := d.Set("location", u.location); err != nil {
104+
return nil, fmt.Errorf("Error setting location: %s", err)
105+
}
88106
if err := d.Set("membership_id", u.GetResourceId()); err != nil {
89107
return nil, fmt.Errorf("Error setting membership_id: %s", err)
90108
}
@@ -100,6 +118,11 @@ func GKEHubMembershipIdParseFunc(d *schema.ResourceData, config *transport_tpg.C
100118
values["project"] = project
101119
}
102120

121+
location, _ := tpgresource.GetLocation(d, config)
122+
if location != "" {
123+
values["location"] = location
124+
}
125+
103126
m, err := tpgresource.GetImportIdQualifiers([]string{"projects/(?P<project>[^/]+)/locations/(?P<location>[^/]+)/memberships/(?P<membership_id>[^/]+)", "(?P<project>[^/]+)/(?P<location>[^/]+)/(?P<membership_id>[^/]+)", "(?P<location>[^/]+)/(?P<membership_id>[^/]+)", "(?P<membership_id>[^/]+)"}, d, config, d.Id())
104127
if err != nil {
105128
return err
@@ -111,6 +134,7 @@ func GKEHubMembershipIdParseFunc(d *schema.ResourceData, config *transport_tpg.C
111134

112135
u := &GKEHubMembershipIamUpdater{
113136
project: values["project"],
137+
location: values["location"],
114138
membershipId: values["membership_id"],
115139
d: d,
116140
Config: config,
@@ -200,7 +224,7 @@ func (u *GKEHubMembershipIamUpdater) SetResourceIamPolicy(policy *cloudresourcem
200224
}
201225

202226
func (u *GKEHubMembershipIamUpdater) qualifyMembershipUrl(methodIdentifier string) (string, error) {
203-
urlTemplate := fmt.Sprintf("{{GKEHubBasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/global/memberships/%s", u.project, u.membershipId), methodIdentifier)
227+
urlTemplate := fmt.Sprintf("{{GKEHubBasePath}}%s:%s", fmt.Sprintf("projects/%s/locations/%s/memberships/%s", u.project, u.location, u.membershipId), methodIdentifier)
204228
url, err := tpgresource.ReplaceVars(u.d, u.Config, urlTemplate)
205229
if err != nil {
206230
return "", err
@@ -209,7 +233,7 @@ func (u *GKEHubMembershipIamUpdater) qualifyMembershipUrl(methodIdentifier strin
209233
}
210234

211235
func (u *GKEHubMembershipIamUpdater) GetResourceId() string {
212-
return fmt.Sprintf("projects/%s/locations/global/memberships/%s", u.project, u.membershipId)
236+
return fmt.Sprintf("projects/%s/locations/%s/memberships/%s", u.project, u.location, u.membershipId)
213237
}
214238

215239
func (u *GKEHubMembershipIamUpdater) GetMutexKey() string {

google/services/gkehub/iam_gke_hub_membership_generated_test.go

+28-34
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ func TestAccGKEHubMembershipIamBindingGenerated(t *testing.T) {
3131
t.Parallel()
3232

3333
context := map[string]interface{}{
34-
"random_suffix": acctest.RandString(t, 10),
35-
"role": "roles/viewer",
36-
"deletion_protection": false,
34+
"random_suffix": acctest.RandString(t, 10),
35+
"role": "roles/viewer",
36+
"project": envvar.GetTestProjectFromEnv(),
37+
"location": envvar.GetTestRegionFromEnv(),
3738
}
3839

3940
acctest.VcrTest(t, resource.TestCase{
@@ -67,9 +68,10 @@ func TestAccGKEHubMembershipIamMemberGenerated(t *testing.T) {
6768
t.Parallel()
6869

6970
context := map[string]interface{}{
70-
"random_suffix": acctest.RandString(t, 10),
71-
"role": "roles/viewer",
72-
"deletion_protection": false,
71+
"random_suffix": acctest.RandString(t, 10),
72+
"role": "roles/viewer",
73+
"project": envvar.GetTestProjectFromEnv(),
74+
"location": envvar.GetTestRegionFromEnv(),
7375
}
7476

7577
acctest.VcrTest(t, resource.TestCase{
@@ -94,9 +96,10 @@ func TestAccGKEHubMembershipIamPolicyGenerated(t *testing.T) {
9496
t.Parallel()
9597

9698
context := map[string]interface{}{
97-
"random_suffix": acctest.RandString(t, 10),
98-
"role": "roles/viewer",
99-
"deletion_protection": false,
99+
"random_suffix": acctest.RandString(t, 10),
100+
"role": "roles/viewer",
101+
"project": envvar.GetTestProjectFromEnv(),
102+
"location": envvar.GetTestRegionFromEnv(),
100103
}
101104

102105
acctest.VcrTest(t, resource.TestCase{
@@ -132,24 +135,22 @@ resource "google_container_cluster" "primary" {
132135
name = "basiccluster%{random_suffix}"
133136
location = "us-central1-a"
134137
initial_node_count = 1
135-
deletion_protection = "%{deletion_protection}"
138+
deletion_protection = false
136139
}
137140
138141
resource "google_gke_hub_membership" "membership" {
139142
membership_id = "basic%{random_suffix}"
143+
location = "%{location}"
140144
endpoint {
141145
gke_cluster {
142146
resource_link = "//container.googleapis.com/${google_container_cluster.primary.id}"
143147
}
144148
}
145-
146-
labels = {
147-
env = "test"
148-
}
149149
}
150150
151151
resource "google_gke_hub_membership_iam_member" "foo" {
152152
project = google_gke_hub_membership.membership.project
153+
location = google_gke_hub_membership.membership.location
153154
membership_id = google_gke_hub_membership.membership.membership_id
154155
role = "%{role}"
155156
member = "user:[email protected]"
@@ -163,20 +164,17 @@ resource "google_container_cluster" "primary" {
163164
name = "basiccluster%{random_suffix}"
164165
location = "us-central1-a"
165166
initial_node_count = 1
166-
deletion_protection = "%{deletion_protection}"
167+
deletion_protection = false
167168
}
168169
169170
resource "google_gke_hub_membership" "membership" {
170171
membership_id = "basic%{random_suffix}"
172+
location = "%{location}"
171173
endpoint {
172174
gke_cluster {
173175
resource_link = "//container.googleapis.com/${google_container_cluster.primary.id}"
174176
}
175177
}
176-
177-
labels = {
178-
env = "test"
179-
}
180178
}
181179
182180
data "google_iam_policy" "foo" {
@@ -188,12 +186,14 @@ data "google_iam_policy" "foo" {
188186
189187
resource "google_gke_hub_membership_iam_policy" "foo" {
190188
project = google_gke_hub_membership.membership.project
189+
location = google_gke_hub_membership.membership.location
191190
membership_id = google_gke_hub_membership.membership.membership_id
192191
policy_data = data.google_iam_policy.foo.policy_data
193192
}
194193
195194
data "google_gke_hub_membership_iam_policy" "foo" {
196195
project = google_gke_hub_membership.membership.project
196+
location = google_gke_hub_membership.membership.location
197197
membership_id = google_gke_hub_membership.membership.membership_id
198198
depends_on = [
199199
google_gke_hub_membership_iam_policy.foo
@@ -208,27 +208,25 @@ resource "google_container_cluster" "primary" {
208208
name = "basiccluster%{random_suffix}"
209209
location = "us-central1-a"
210210
initial_node_count = 1
211-
deletion_protection = "%{deletion_protection}"
211+
deletion_protection = false
212212
}
213213
214214
resource "google_gke_hub_membership" "membership" {
215215
membership_id = "basic%{random_suffix}"
216+
location = "%{location}"
216217
endpoint {
217218
gke_cluster {
218219
resource_link = "//container.googleapis.com/${google_container_cluster.primary.id}"
219220
}
220221
}
221-
222-
labels = {
223-
env = "test"
224-
}
225222
}
226223
227224
data "google_iam_policy" "foo" {
228225
}
229226
230227
resource "google_gke_hub_membership_iam_policy" "foo" {
231228
project = google_gke_hub_membership.membership.project
229+
location = google_gke_hub_membership.membership.location
232230
membership_id = google_gke_hub_membership.membership.membership_id
233231
policy_data = data.google_iam_policy.foo.policy_data
234232
}
@@ -241,24 +239,22 @@ resource "google_container_cluster" "primary" {
241239
name = "basiccluster%{random_suffix}"
242240
location = "us-central1-a"
243241
initial_node_count = 1
244-
deletion_protection = "%{deletion_protection}"
242+
deletion_protection = false
245243
}
246244
247245
resource "google_gke_hub_membership" "membership" {
248246
membership_id = "basic%{random_suffix}"
247+
location = "%{location}"
249248
endpoint {
250249
gke_cluster {
251250
resource_link = "//container.googleapis.com/${google_container_cluster.primary.id}"
252251
}
253252
}
254-
255-
labels = {
256-
env = "test"
257-
}
258253
}
259254
260255
resource "google_gke_hub_membership_iam_binding" "foo" {
261256
project = google_gke_hub_membership.membership.project
257+
location = google_gke_hub_membership.membership.location
262258
membership_id = google_gke_hub_membership.membership.membership_id
263259
role = "%{role}"
264260
members = ["user:[email protected]"]
@@ -272,24 +268,22 @@ resource "google_container_cluster" "primary" {
272268
name = "basiccluster%{random_suffix}"
273269
location = "us-central1-a"
274270
initial_node_count = 1
275-
deletion_protection = "%{deletion_protection}"
271+
deletion_protection = false
276272
}
277273
278274
resource "google_gke_hub_membership" "membership" {
279275
membership_id = "basic%{random_suffix}"
276+
location = "%{location}"
280277
endpoint {
281278
gke_cluster {
282279
resource_link = "//container.googleapis.com/${google_container_cluster.primary.id}"
283280
}
284281
}
285-
286-
labels = {
287-
env = "test"
288-
}
289282
}
290283
291284
resource "google_gke_hub_membership_iam_binding" "foo" {
292285
project = google_gke_hub_membership.membership.project
286+
location = google_gke_hub_membership.membership.location
293287
membership_id = google_gke_hub_membership.membership.membership_id
294288
role = "%{role}"
295289
members = ["user:[email protected]", "user:[email protected]"]

0 commit comments

Comments
 (0)