in pkg/berglas/grant.go [97:141]
func (c *Client) secretManagerGrant(ctx context.Context, i *SecretManagerGrantRequest) error {
project := i.Project
if project == "" {
return fmt.Errorf("missing project")
}
name := i.Name
if name == "" {
return fmt.Errorf("missing secret name")
}
members := i.Members
if len(members) == 0 {
return nil
}
sort.Strings(members)
logger := logging.FromContext(ctx).With(
"project", project,
"name", name,
"members", members,
)
logger.DebugContext(ctx, "grant.start")
defer logger.DebugContext(ctx, "grant.finish")
logger.DebugContext(ctx, "granting access to secret")
storageHandle := c.secretManagerIAM(project, name)
if err := updateIAMPolicy(ctx, storageHandle, func(p *iam.Policy) *iam.Policy {
for _, m := range members {
p.Add(m, iamSecretManagerAccessor)
}
return p
}); err != nil {
terr, ok := grpcstatus.FromError(err)
if ok && terr.Code() == grpccodes.NotFound {
return errSecretDoesNotExist
}
return fmt.Errorf("failed to update Secret Manager IAM policy for %s: %w", name, err)
}
return nil
}