support ListPages,QueryPages paginate

Signed-off-by: huangjunwei <huangjunwei@youmi.net>
pull/31461/head
huangjunwei 8 months ago
parent 384a3f0ff8
commit 218e87cad9

@ -38,8 +38,14 @@ import (
var _ Driver = (*Secrets)(nil)
// SecretsDriverName is the string name of the driver.
const SecretsDriverName = "Secret"
const (
// SecretsDriverName is the string name of the driver.
SecretsDriverName = "Secret"
// owner is owner of the secret
owner = "helm"
// DefaultPaginationLimit .
DefaultPaginationLimit = 50
)
// Secrets is a wrapper around an implementation of a kubernetes
// SecretsInterface.
@ -84,11 +90,52 @@ func (secrets *Secrets) Get(key string) (release.Releaser, error) {
return r, nil
}
// listPages common methods to list release pagination
func (secrets *Secrets) listPages(f func(page []release.Releaser, lastPage bool) (end bool), opts metav1.ListOptions, filter func(release.Releaser) bool) (err error) {
token := ""
if opts.Limit == 0 {
opts.Limit = DefaultPaginationLimit
}
Loop:
for {
list, err := secrets.impl.List(context.Background(), opts)
if nil != err {
return err
}
token = list.Continue
var results []release.Releaser
// iterate over the secrets object list
// and decode each release
for _, item := range list.Items {
rls, err := decodeRelease(string(item.Data["release"]))
if err != nil {
secrets.Logger().Debug("list failed to decode release", "key", item.Name, slog.Any("error", err))
continue
}
rls.Labels = item.Labels
if filter(rls) {
results = append(results, rls)
}
}
if f(results, token != "") {
break Loop
}
}
return nil
}
// List fetches all releases and returns the list releases such
// that filter(release) == true. An error is returned if the
// secret fails to retrieve the releases.
func (secrets *Secrets) List(filter func(release.Releaser) bool) ([]release.Releaser, error) {
lsel := kblabels.Set{"owner": "helm"}.AsSelector()
lsel := kblabels.Set{"owner": owner}.AsSelector()
opts := metav1.ListOptions{LabelSelector: lsel.String()}
list, err := secrets.impl.List(context.Background(), opts)
@ -116,6 +163,14 @@ func (secrets *Secrets) List(filter func(release.Releaser) bool) ([]release.Rele
return results, nil
}
// ListPages same as List, but with pagination
func (secrets *Secrets) ListPages(f func(page []release.Releaser, lastPage bool) (end bool), filter func(release.Releaser) bool) error {
lsel := kblabels.Set{"owner": owner}.AsSelector()
opts := metav1.ListOptions{LabelSelector: lsel.String()}
return secrets.listPages(f, opts, filter)
}
// Query fetches all releases that match the provided map of labels.
// An error is returned if the secret fails to retrieve the releases.
func (secrets *Secrets) Query(labels map[string]string) ([]release.Releaser, error) {
@ -151,6 +206,21 @@ func (secrets *Secrets) Query(labels map[string]string) ([]release.Releaser, err
return results, nil
}
// QueryPages same as Query, but with pagination
func (secrets *Secrets) QueryPages(f func(page []release.Releaser, lastPage bool) (end bool), labels map[string]string) error {
ls := kblabels.Set{}
for k, v := range labels {
if errs := validation.IsValidLabelValue(v); len(errs) != 0 {
return fmt.Errorf("invalid label value: %q: %s", v, strings.Join(errs, "; "))
}
ls[k] = v
}
opts := metav1.ListOptions{LabelSelector: ls.AsSelector().String()}
return secrets.listPages(f, opts, func(release.Releaser) bool { return true })
}
// Create creates a new Secret holding the release. If the
// Secret already exists, ErrReleaseExists is returned.
func (secrets *Secrets) Create(key string, rel release.Releaser) error {
@ -237,8 +307,6 @@ func (secrets *Secrets) Delete(key string) (rls release.Releaser, err error) {
// "owner" - owner of the secret, currently "helm".
// "name" - name of the release.
func newSecretsObject(key string, rls *rspb.Release, lbs labels) (*v1.Secret, error) {
const owner = "helm"
// encode the release
s, err := encodeRelease(rls)
if err != nil {

Loading…
Cancel
Save