func()

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
}