in tools/ctpu/commands/auth.go [270:354]
func (c *authAddGcs) Execute(ctx context.Context, flags *flag.FlagSet, args ...interface{}) subcommands.ExitStatus {
project, err := c.cp.GetProject()
if err != nil {
log.Fatalf("Error retrieving project metadata for project %q: %v", c.cfg.Project, err)
}
sa := makeTPUServiceName(project)
policy, err := c.cp.GetProjectPolicy()
if err != nil {
log.Fatalf("Error retrieving project IAM policy for project: %q: %v", c.cfg.Project, err)
}
var bindingToModify *cloudresourcemanager.Binding
for _, b := range policy.Bindings {
if b.Role == storageRole {
if bindingHasServiceAccount(sa, b) {
fmt.Printf("Cloud TPUs in project %q already have access to Cloud Storage.\nNo changes were made.\n", c.cfg.Project)
return subcommands.ExitSuccess
}
bindingToModify = b
}
}
if flags.NArg() == 0 {
if c.readonly {
fmt.Printf("--readonly is not compatible with project-wide IAM roles.\n")
return subcommands.ExitUsageError
}
if !c.skipConf {
ok, err := askForConfirmation("Are you sure you want to set project-wide permissions?")
if err != nil {
log.Fatalf("Error while asking for confirmation: %v", err)
return subcommands.ExitFailure
}
if !ok {
fmt.Printf("No changes have been made; exiting!\n")
return subcommands.ExitUsageError
}
}
// Set project-wide permissions.
if bindingToModify == nil {
bindingToModify = &cloudresourcemanager.Binding{Role: storageRole}
policy.Bindings = append(policy.Bindings, bindingToModify)
}
bindingToModify.Members = append(bindingToModify.Members, sa)
err = c.cp.SetProjectPolicy(policy)
if err != nil {
log.Fatalf("Error setting the IAM policy for project %q: %v", c.cfg.Project, err)
}
return subcommands.ExitSuccess
} else if flags.NArg() == 1 {
bucketName := flags.Arg(0)
aclRules, err := c.cp.GetBucketACL(ctx, bucketName)
if err != nil {
log.Fatalf("Could not retrieve ACLs for bucket %q: %v", bucketName, err)
}
tpuEntity := storage.ACLEntity(fmt.Sprintf("user-service-%d@cloud-tpu.iam.gserviceaccount.com", project.ProjectNumber))
for _, r := range aclRules {
if r.Entity == tpuEntity {
if r.Role == storage.RoleOwner || r.Role == roleWriter || (c.readonly && r.Role == storage.RoleReader) {
fmt.Printf("Cloud TPUs in project %q already have permissions on bucket %q.\nNo changes have been made.\n", c.cfg.Project, bucketName)
return subcommands.ExitSuccess
}
}
}
setRole := storage.RoleOwner
if c.readonly {
setRole = storage.RoleReader
}
err = c.cp.SetBucketACL(ctx, bucketName, tpuEntity, setRole)
if err != nil {
log.Fatalf("Error setting ACL on bucket %q: %v", bucketName, err)
}
return subcommands.ExitSuccess
} else {
fmt.Printf("Usage error: too many arguments supplied.\n")
return subcommands.ExitUsageError
}
}