From 266c74f390c6dcd08ffbbe942df99d5557632806 Mon Sep 17 00:00:00 2001 From: Dmitry Chepurovskiy Date: Tue, 4 Aug 2020 18:17:56 +0300 Subject: [PATCH] Move selector filtering after latest release version filtering Signed-off-by: Dmitry Chepurovskiy --- pkg/action/list.go | 29 +++++++++++++++++++---------- pkg/release/release.go | 5 +++-- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/pkg/action/list.go b/pkg/action/list.go index 56008c6fa..5ba0c4770 100644 --- a/pkg/action/list.go +++ b/pkg/action/list.go @@ -154,22 +154,12 @@ func (l *List) Run() ([]*release.Release, error) { } } - selectorObj, err := labels.Parse(l.Selector) - if err != nil { - return nil, err - } - results, err := l.cfg.Releases.List(func(rel *release.Release) bool { // Skip anything that doesn't match the filter. if filter != nil && !filter.MatchString(rel.Name) { return false } - // Skip anything that doesn't match the selector - if !selectorObj.Matches(labels.Set(rel.Labels)) { - return false - } - return true }) @@ -192,6 +182,13 @@ func (l *List) Run() ([]*release.Release, error) { // latest releases, otherwise outdated entries can be returned results = l.filterStateMask(results) + // Skip anything that doesn't match the selector + selectorObj, err := labels.Parse(l.Selector) + if err != nil { + return nil, err + } + results = l.filterSelector(results, selectorObj) + // Unfortunately, we have to sort before truncating, which can incur substantial overhead l.sort(results) @@ -274,6 +271,18 @@ func (l *List) filterStateMask(releases []*release.Release) []*release.Release { return desiredStateReleases } +func (l *List) filterSelector(releases []*release.Release, selector labels.Selector) []*release.Release { + desiredStateReleases := make([]*release.Release, 0) + + for _, rls := range releases { + if selector.Matches(labels.Set(rls.Labels)) { + desiredStateReleases = append(desiredStateReleases, rls) + } + } + + return desiredStateReleases +} + // SetStateMask calculates the state mask based on parameters. func (l *List) SetStateMask() { if l.All { diff --git a/pkg/release/release.go b/pkg/release/release.go index 1245d8129..b90612873 100644 --- a/pkg/release/release.go +++ b/pkg/release/release.go @@ -37,8 +37,9 @@ type Release struct { Version int `json:"version,omitempty"` // Namespace is the kubernetes namespace of the release. Namespace string `json:"namespace,omitempty"` - // Labels of the release - Labels map[string]string `json:"labels,omitempty"` + // Labels of the release. + // Disabled encoding into Json cause labels are stored in storage driver metadata field. + Labels map[string]string `json:"-"` } // SetStatus is a helper for setting the status on a release.