@@ -9,9 +9,10 @@ import (
9
9
"testing"
10
10
"time"
11
11
12
- "google.golang.org/api/cloudkms/v1"
12
+ "google.golang.org/api/cloudbilling/v1"
13
+ cloudkms "google.golang.org/api/cloudkms/v1"
13
14
cloudresourcemanager "google.golang.org/api/cloudresourcemanager/v1"
14
- "google.golang.org/api/iam/v1"
15
+ iam "google.golang.org/api/iam/v1"
15
16
sqladmin "google.golang.org/api/sqladmin/v1beta4"
16
17
)
17
18
@@ -358,6 +359,163 @@ func BootstrapServicePerimeterProjects(t *testing.T, desiredProjects int) []*clo
358
359
return projects
359
360
}
360
361
362
+ func removeContainerServiceAgentRoleFromContainerEngineRobot (t * testing.T , project * cloudresourcemanager.Project ) {
363
+ config := BootstrapConfig (t )
364
+ if config == nil {
365
+ return
366
+ }
367
+
368
+ client := config .NewResourceManagerClient (config .userAgent )
369
+ containerEngineRobot := fmt .
Sprintf (
"serviceAccount:service-%[email protected] " ,
project .
ProjectNumber )
370
+ getPolicyRequest := & cloudresourcemanager.GetIamPolicyRequest {}
371
+ policy , err := client .Projects .GetIamPolicy (project .ProjectId , getPolicyRequest ).Do ()
372
+ if err != nil {
373
+ t .Fatalf ("error getting project iam policy: %v" , err )
374
+ }
375
+ roleFound := false
376
+ changed := false
377
+ for _ , binding := range policy .Bindings {
378
+ if binding .Role == "roles/container.serviceAgent" {
379
+ memberFound := false
380
+ for i , member := range binding .Members {
381
+ if member == containerEngineRobot {
382
+ binding .Members [i ] = binding .Members [len (binding .Members )- 1 ]
383
+ memberFound = true
384
+ }
385
+ }
386
+ if memberFound {
387
+ binding .Members = binding .Members [:len (binding .Members )- 1 ]
388
+ changed = true
389
+ }
390
+ } else if binding .Role == "roles/editor" {
391
+ memberFound := false
392
+ for _ , member := range binding .Members {
393
+ if member == containerEngineRobot {
394
+ memberFound = true
395
+ break
396
+ }
397
+ }
398
+ if ! memberFound {
399
+ binding .Members = append (binding .Members , containerEngineRobot )
400
+ changed = true
401
+ }
402
+ roleFound = true
403
+ }
404
+ }
405
+ if ! roleFound {
406
+ policy .Bindings = append (policy .Bindings , & cloudresourcemanager.Binding {
407
+ Members : []string {containerEngineRobot },
408
+ Role : "roles/editor" ,
409
+ })
410
+ changed = true
411
+ }
412
+ if changed {
413
+ setPolicyRequest := & cloudresourcemanager.SetIamPolicyRequest {Policy : policy }
414
+ policy , err = client .Projects .SetIamPolicy (project .ProjectId , setPolicyRequest ).Do ()
415
+ if err != nil {
416
+ t .Fatalf ("error setting project iam policy: %v" , err )
417
+ }
418
+ }
419
+ }
420
+
421
+ func BootstrapProject (t * testing.T , projectID , billingAccount string , services []string ) * cloudresourcemanager.Project {
422
+ config := BootstrapConfig (t )
423
+ if config == nil {
424
+ return nil
425
+ }
426
+
427
+ crmClient := config .NewResourceManagerClient (config .userAgent )
428
+
429
+ project , err := crmClient .Projects .Get (projectID ).Do ()
430
+ if err != nil {
431
+ if ! isGoogleApiErrorWithCode (err , 403 ) {
432
+ t .Fatalf ("Error getting bootstrapped project: %s" , err )
433
+ }
434
+ org := getTestOrgFromEnv (t )
435
+
436
+ op , err := crmClient .Projects .Create (& cloudresourcemanager.Project {
437
+ ProjectId : projectID ,
438
+ Name : "Bootstrapped Test Project" ,
439
+ Parent : & cloudresourcemanager.ResourceId {
440
+ Type : "organization" ,
441
+ Id : org ,
442
+ },
443
+ }).Do ()
444
+ if err != nil {
445
+ t .Fatalf ("Error creating bootstrapped test project: %s" , err )
446
+ }
447
+
448
+ opAsMap , err := ConvertToMap (op )
449
+ if err != nil {
450
+ t .Fatalf ("Error converting create project operation to map: %s" , err )
451
+ }
452
+
453
+ err = resourceManagerOperationWaitTime (config , opAsMap , "creating project" , config .userAgent , 4 * time .Minute )
454
+ if err != nil {
455
+ t .Fatalf ("Error waiting for create project operation: %s" , err )
456
+ }
457
+
458
+ project , err = crmClient .Projects .Get (projectID ).Do ()
459
+ if err != nil {
460
+ t .Fatalf ("Error getting bootstrapped project: %s" , err )
461
+ }
462
+
463
+ }
464
+
465
+ if project .LifecycleState == "DELETE_REQUESTED" {
466
+ _ , err := crmClient .Projects .Undelete (projectID , & cloudresourcemanager.UndeleteProjectRequest {}).Do ()
467
+ if err != nil {
468
+ t .Fatalf ("Error undeleting bootstrapped project: %s" , err )
469
+ }
470
+ }
471
+
472
+ if billingAccount != "" {
473
+ billingClient := config .NewBillingClient (config .userAgent )
474
+ var pbi * cloudbilling.ProjectBillingInfo
475
+ err = retryTimeDuration (func () error {
476
+ var reqErr error
477
+ pbi , reqErr = billingClient .Projects .GetBillingInfo (prefixedProject (projectID )).Do ()
478
+ return reqErr
479
+ }, 30 * time .Second )
480
+ if err != nil {
481
+ t .Fatalf ("Error getting billing info for project %q: %v" , projectID , err )
482
+ }
483
+ if strings .TrimPrefix (pbi .BillingAccountName , "billingAccounts/" ) != billingAccount {
484
+ pbi .BillingAccountName = "billingAccounts/" + billingAccount
485
+ err := retryTimeDuration (func () error {
486
+ _ , err := config .NewBillingClient (config .userAgent ).Projects .UpdateBillingInfo (prefixedProject (projectID ), pbi ).Do ()
487
+ return err
488
+ }, 2 * time .Minute )
489
+ if err != nil {
490
+ t .Fatalf ("Error setting billing account for project %q to %q: %s" , projectID , billingAccount , err )
491
+ }
492
+ }
493
+ }
494
+
495
+ if len (services ) > 0 {
496
+
497
+ enabledServices , err := listCurrentlyEnabledServices (projectID , "" , config .userAgent , config , 1 * time .Minute )
498
+ if err != nil {
499
+ t .Fatalf ("Error listing services for project %q: %s" , projectID , err )
500
+ }
501
+
502
+ servicesToEnable := make ([]string , 0 , len (services ))
503
+ for _ , service := range services {
504
+ if _ , ok := enabledServices [service ]; ! ok {
505
+ servicesToEnable = append (servicesToEnable , service )
506
+ }
507
+ }
508
+
509
+ if len (servicesToEnable ) > 0 {
510
+ if err := enableServiceUsageProjectServices (servicesToEnable , projectID , "" , config .userAgent , config , 10 * time .Minute ); err != nil {
511
+ t .Fatalf ("Error enabling services for project %q: %s" , projectID , err )
512
+ }
513
+ }
514
+ }
515
+
516
+ return project
517
+ }
518
+
361
519
func BootstrapConfig (t * testing.T ) * Config {
362
520
if v := os .Getenv ("TF_ACC" ); v == "" {
363
521
t .Skip ("Acceptance tests and bootstrapping skipped unless env 'TF_ACC' set" )
0 commit comments