in pkg/berglas/list.go [125:209]
func (c *Client) secretManagerList(ctx context.Context, i *SecretManagerListRequest) (*ListResponse, error) {
project := i.Project
if project == "" {
return nil, fmt.Errorf("missing project")
}
prefix := i.Prefix
versions := i.Versions
logger := logging.FromContext(ctx).With(
"project", project,
"prefix", prefix,
"versions", versions,
)
logger.DebugContext(ctx, "list.start")
defer logger.DebugContext(ctx, "list.finish")
allSecrets := []*Secret{}
it := c.secretManagerClient.ListSecrets(ctx, &secretspb.ListSecretsRequest{
Parent: fmt.Sprintf("projects/%s", project),
})
for {
resp, err := it.Next()
if err == iterator.Done {
logger.DebugContext(ctx, "out of secrets")
break
}
if err != nil {
return nil, fmt.Errorf("failed to list secrets: %w", err)
}
if strings.HasPrefix(path.Base(resp.Name), prefix) {
allSecrets = append(allSecrets, &Secret{
Parent: project,
Name: path.Base(resp.Name),
UpdatedAt: timestampToTime(resp.CreateTime),
})
}
}
if !versions {
sort.Sort(secretList(allSecrets))
return &ListResponse{
Secrets: allSecrets,
}, nil
}
allSecretVersions := make([]*Secret, 0, len(allSecrets)*2)
for _, s := range allSecrets {
logger := logger.With(
"project", s.Parent,
"name", s.Name)
logger.DebugContext(ctx, "listing secret versions")
it := c.secretManagerClient.ListSecretVersions(ctx, &secretspb.ListSecretVersionsRequest{
Parent: fmt.Sprintf("projects/%s/secrets/%s", s.Parent, s.Name),
})
for {
resp, err := it.Next()
if err == iterator.Done {
logger.DebugContext(ctx, "out of versions")
break
}
if err != nil {
return nil, fmt.Errorf("failed to list versions for %s: %w", s.Name, err)
}
allSecretVersions = append(allSecretVersions, &Secret{
Parent: project,
Name: s.Name,
Version: path.Base(resp.Name),
UpdatedAt: timestampToTime(resp.CreateTime),
})
}
}
sort.Sort(secretList(allSecretVersions))
return &ListResponse{
Secrets: allSecretVersions,
}, nil
}