Skip to content

Commit 9eee0fb

Browse files
authored
Add acceptance tests for provider configuration behaviour using user_project_override (#11686)
1 parent dc0336f commit 9eee0fb

File tree

4 files changed

+766
-173
lines changed

4 files changed

+766
-173
lines changed

mmv1/third_party/terraform/acctest/bootstrap_test_utils.go renamed to mmv1/third_party/terraform/acctest/bootstrap_test_utils.go.tmpl

+33-15
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ func getOrCreateServiceAccount(config *transport_tpg.Config, project, serviceAcc
156156

157157
sa, err := config.NewIamClient(config.UserAgent).Projects.ServiceAccounts.Get(name).Do()
158158
if err != nil && !transport_tpg.IsGoogleApiErrorWithCode(err, 404) {
159-
return nil, err
159+
return nil, fmt.Errorf("encountered a non-404 error when looking for bootstrapped service account %s: %w", name, err)
160160
}
161161

162162
if sa == nil {
@@ -171,7 +171,7 @@ func getOrCreateServiceAccount(config *transport_tpg.Config, project, serviceAcc
171171
}
172172
sa, err = config.NewIamClient(config.UserAgent).Projects.ServiceAccounts.Create("projects/"+project, r).Do()
173173
if err != nil {
174-
return nil, err
174+
return nil, fmt.Errorf("error when creating bootstrapped service account %s: %w", name, err)
175175
}
176176
}
177177

@@ -1231,13 +1231,13 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
12311231
Timeout: 5 * time.Minute,
12321232
})
12331233
if err != nil {
1234-
return "", err
1234+
return "", fmt.Errorf("error creating 'project-1' with project id %s: %w", pid, err)
12351235
}
12361236

12371237
// Wait for the operation to complete
12381238
opAsMap, err := tpgresource.ConvertToMap(op)
12391239
if err != nil {
1240-
return "", err
1240+
return "", fmt.Errorf("error in ConvertToMap while creating 'project-1' with project id %s: %w", pid, err)
12411241
}
12421242

12431243
waitErr := resourcemanager.ResourceManagerOperationWaitTime(config, opAsMap, "creating project", config.UserAgent, 5*time.Minute)
@@ -1250,7 +1250,7 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
12501250
}
12511251
_, err = config.NewBillingClient(config.UserAgent).Projects.UpdateBillingInfo(resourcemanager.PrefixedProject(pid), ba).Do()
12521252
if err != nil {
1253-
return "", err
1253+
return "", fmt.Errorf("error updating billing info for 'project-1' with project id %s: %w", pid, err)
12541254
}
12551255

12561256
p2 := fmt.Sprintf("%s-2", pid)
@@ -1265,7 +1265,7 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
12651265
Timeout: 5 * time.Minute,
12661266
})
12671267
if err != nil {
1268-
return "", err
1268+
return "", fmt.Errorf("error creating 'project-2' with project id %s: %w", p2, err)
12691269
}
12701270

12711271
// Wait for the operation to complete
@@ -1281,7 +1281,7 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
12811281

12821282
_, err = config.NewBillingClient(config.UserAgent).Projects.UpdateBillingInfo(resourcemanager.PrefixedProject(p2), ba).Do()
12831283
if err != nil {
1284-
return "", err
1284+
return "", fmt.Errorf("error updating billing info for 'project-2' with project id %s: %w", p2, err)
12851285
}
12861286

12871287
// Enable the appropriate service in project-2 only
@@ -1293,14 +1293,14 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
12931293

12941294
_, err = suService.Services.BatchEnable(fmt.Sprintf("projects/%s", p2), serviceReq).Do()
12951295
if err != nil {
1296-
return "", err
1296+
return "", fmt.Errorf("error batch enabling services in 'project-2' with project id %s: %w", p2, err)
12971297
}
12981298

12991299
// Enable the test runner to create service accounts and get an access token on behalf of
13001300
// the project 1 service account
13011301
curEmail, err := transport_tpg.GetCurrentUserEmail(config, config.UserAgent)
13021302
if err != nil {
1303-
return "", err
1303+
return "", fmt.Errorf("error getting current user email: %w", err)
13041304
}
13051305

13061306
proj1SATokenCreator := &cloudresourcemanager.Binding{
@@ -1322,7 +1322,7 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
13221322
},
13231323
}).Do()
13241324
if err != nil {
1325-
return "", err
1325+
return "", fmt.Errorf("error getting IAM policy for 'project-1' with project id %s: %w", pid, err)
13261326
}
13271327

13281328
p.Bindings = tpgiamresource.MergeBindings(append(p.Bindings, bindings...))
@@ -1332,15 +1332,18 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
13321332
UpdateMask: "bindings,etag,auditConfigs",
13331333
}).Do()
13341334
if err != nil {
1335-
return "", err
1335+
return "", fmt.Errorf("error setting IAM policy for 'project-1' with project id %s: %w", pid, err)
13361336
}
13371337

13381338
// Create a service account for project-1
13391339
serviceAccountEmail := serviceAccountPrefix + service
13401340
sa1, err := getOrCreateServiceAccount(config, pid, serviceAccountEmail)
13411341
if err != nil {
1342-
return "", err
1342+
return "", fmt.Errorf("error creating service account %s in 'project-1' with project id %s: %w", serviceAccountEmail, pid, err)
13431343
}
1344+
// Setting IAM policies sometimes fails due to the service account not being created yet
1345+
// Wait a minute to ensure we can use it.
1346+
time.Sleep(1 * time.Minute)
13441347

13451348
// Add permissions to service accounts
13461349

@@ -1368,14 +1371,29 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
13681371
bindings = tpgiamresource.MergeBindings(append(bindings, proj2CryptoKeyBinding))
13691372
}
13701373

1374+
1375+
{{ if ne $.TargetVersionName `ga` -}}
1376+
// For Firebase test only
1377+
if service == "firebase" {
1378+
// Additional permissions besides roles/serviceusage.serviceUsageConsumer and roles/firebase.admin are needed
1379+
// https://firebase.google.com/docs/reference/firebase-management/rest/v1beta1/projects/addFirebase
1380+
proj2ServiceUsageBinding := &cloudresourcemanager.Binding{
1381+
Members: []string{fmt.Sprintf("serviceAccount:%s", sa1.Email)},
1382+
Role: "roles/serviceusage.serviceUsageAdmin",
1383+
}
1384+
1385+
bindings = tpgiamresource.MergeBindings(append(bindings, proj2ServiceUsageBinding))
1386+
}
1387+
{{- end }}
1388+
13711389
p, err = rmService.Projects.GetIamPolicy(p2,
13721390
&cloudresourcemanager.GetIamPolicyRequest{
13731391
Options: &cloudresourcemanager.GetPolicyOptions{
13741392
RequestedPolicyVersion: tpgiamresource.IamPolicyVersion,
13751393
},
13761394
}).Do()
13771395
if err != nil {
1378-
return "", err
1396+
return "", fmt.Errorf("error getting IAM policy for 'project-2' with project id %s: %w", p2, err)
13791397
}
13801398

13811399
p.Bindings = tpgiamresource.MergeBindings(append(p.Bindings, bindings...))
@@ -1385,7 +1403,7 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
13851403
UpdateMask: "bindings,etag,auditConfigs",
13861404
}).Do()
13871405
if err != nil {
1388-
return "", err
1406+
return "", fmt.Errorf("error setting IAM policy for 'project-2' with project id %s: %w", p2, err)
13891407
}
13901408

13911409
// The token creator IAM API call returns success long before the policy is
@@ -1399,7 +1417,7 @@ func SetupProjectsAndGetAccessToken(org, billing, pid, service string, config *t
13991417
}
14001418
atResp, err := iamCredsService.Projects.ServiceAccounts.GenerateAccessToken(fmt.Sprintf("projects/-/serviceAccounts/%s", sa1.Email), tokenRequest).Do()
14011419
if err != nil {
1402-
return "", err
1420+
return "", fmt.Errorf("error generating access token for service account %s: %w", sa1.Email, err)
14031421
}
14041422

14051423
accessToken := atResp.AccessToken

0 commit comments

Comments
 (0)