func()

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
}