@@ -33,7 +33,6 @@ import (
3333 "github.com/stretchr/testify/assert"
3434 "github.com/tidwall/gjson"
3535 "golang.org/x/oauth2/google"
36- "google.golang.org/api/cloudresourcemanager/v1"
3736 "google.golang.org/api/option"
3837 "gopkg.in/yaml.v2"
3938)
@@ -456,71 +455,29 @@ func deleteFirewallRule(t *testing.T, projectID, firewallRuleName string) {
456455
457456// validateAndAssignRoles validates and assigns necessary roles to the service account.
458457func validateAndAssignRoles (t * testing.T , serviceAccountEmail string , projectID string ) error {
459- ctx := context .Background ()
460- credentials , err := google .FindDefaultCredentials (ctx )
461- if err != nil {
462- return fmt .Errorf ("failed to get default credentials: %w" , err )
463- }
464-
465- resourceManagerClient , err := cloudresourcemanager .NewService (ctx , option .WithCredentials (credentials ))
466- if err != nil {
467- return fmt .Errorf ("failed to create resource manager client: %w" , err )
468- }
469-
470- policy , err := resourceManagerClient .Projects .GetIamPolicy (projectID , & cloudresourcemanager.GetIamPolicyRequest {}).Do ()
471- if err != nil {
472- return fmt .Errorf ("failed to get IAM policy for project %s: %w" , projectID , err )
473- }
474-
458+ t .Helper ()
475459 requiredRoles := []string {
476460 "roles/bigquery.jobUser" ,
477461 "roles/bigquery.dataViewer" ,
478462 "roles/serviceusage.serviceUsageConsumer" ,
479- // Add necessary permissions for interacting with the Workbench API
480463 "roles/notebooks.admin" , // Or a more specific role if needed
481464 "roles/iam.serviceAccountUser" , // To allow the SA to act as itself
482465 }
483466
484467 member := fmt .Sprintf ("serviceAccount:%s" , serviceAccountEmail )
485468
486- policyUpdated := false
487469 for _ , role := range requiredRoles {
488- roleAssigned := false
489- for _ , binding := range policy .Bindings {
490- if binding .Role == role {
491- for _ , m := range binding .Members {
492- if m == member {
493- roleAssigned = true
494- break
495- }
496- }
497- if roleAssigned {
498- break
499- }
500- if ! roleAssigned {
501- binding .Members = append (binding .Members , member )
502- policyUpdated = true
503- }
504-
505- }
506- }
507- if ! roleAssigned {
508- policy .Bindings = append (policy .Bindings , & cloudresourcemanager.Binding {
509- Role : role ,
510- Members : []string {member },
511- })
512- policyUpdated = true
470+ t .Logf ("Adding role %s to %s for project %s" , role , member , projectID )
471+ cmd := shell.Command {
472+ Command : "gcloud" ,
473+ Args : []string {"projects" , "add-iam-policy-binding" , projectID , "--member=" + member , "--role=" + role , "--condition=None" },
513474 }
514-
515- }
516- if policyUpdated {
517- _ , err = resourceManagerClient .Projects .SetIamPolicy (projectID , & cloudresourcemanager.SetIamPolicyRequest {Policy : policy }).Do ()
475+ output , err := shell .RunCommandAndGetOutputE (t , cmd )
518476 if err != nil {
519- return fmt .Errorf ("failed to set IAM policy for project %s: %w" , projectID , err )
477+ t .Logf ("Failed to add IAM binding '%s' for member '%s' to project '%s'. Output:\n %s, Error: %v" , role , member , projectID , output , err )
478+ return fmt .Errorf ("failed to add IAM binding '%s' for member '%s': %w" , role , member , err )
520479 }
521- t .Logf ("Successfully assigned required roles to service account: %s" , serviceAccountEmail )
522- } else {
523- t .Logf ("All required roles already assigned to service account: %s" , serviceAccountEmail )
480+ t .Logf ("Successfully added role %s to %s for project %s" , role , member , projectID )
524481 }
525482
526483 return nil
0 commit comments