fix: filter system labels from release labels in List/Query

Secrets.List/Query and ConfigMaps.List/Query returned the raw object
labels, including system labels (name, owner, status, version,
createdAt, modifiedAt), unlike Get which already filters them. This
let system labels ride along in lastRelease.Labels on upgrade and get
merged into the new release, permanently baking stale createdAt values
and system-label keys into the stored release body.

Fixes #32404

Signed-off-by: bhuvan-somisetty <somisettybhuvan5@gmail.com>
pull/32421/head
bhuvan-somisetty 2 months ago
parent 8c7f3a14d2
commit 9cb5367a4d
No known key found for this signature in database
GPG Key ID: 18A2EBE1548EEEE3

@ -113,7 +113,7 @@ func (cfgmaps *ConfigMaps) List(filter func(release.Releaser) bool) ([]release.R
continue continue
} }
rls.Labels = item.Labels rls.Labels = filterSystemLabels(item.Labels)
if filter(rls) { if filter(rls) {
results = append(results, rls) results = append(results, rls)
@ -152,7 +152,7 @@ func (cfgmaps *ConfigMaps) Query(labels map[string]string) ([]release.Releaser,
cfgmaps.Logger().Debug("failed to decode release", slog.Any("error", err)) cfgmaps.Logger().Debug("failed to decode release", slog.Any("error", err))
continue continue
} }
rls.Labels = item.Labels rls.Labels = filterSystemLabels(item.Labels)
results = append(results, rls) results = append(results, rls)
} }
return results, nil return results, nil

@ -149,11 +149,12 @@ func TestConfigMapList(t *testing.T) {
if len(ssd) != 2 { if len(ssd) != 2 {
t.Errorf("Expected 2 superseded, got %d", len(ssd)) t.Errorf("Expected 2 superseded, got %d", len(ssd))
} }
// Check if release having both system and custom labels, this is needed to ensure that selector filtering would work. // List should return custom labels only, system labels (name, owner, status, etc.)
// must not leak into rls.Labels or they'll be carried into the next revision on upgrade.
rls := convertReleaserToV1(t, ssd[0]) rls := convertReleaserToV1(t, ssd[0])
_, ok := rls.Labels["name"] _, ok := rls.Labels["name"]
if !ok { if ok {
t.Fatalf("Expected 'name' label in results, actual %v", rls.Labels) t.Fatalf("Expected 'name' system label to be filtered out, actual %v", rls.Labels)
} }
_, ok = rls.Labels["key1"] _, ok = rls.Labels["key1"]
if !ok { if !ok {
@ -179,6 +180,12 @@ func TestConfigMapQuery(t *testing.T) {
t.Errorf("Expected 2 results, got %d", len(rls)) t.Errorf("Expected 2 results, got %d", len(rls))
} }
// Query should return custom labels only, same as Get and List.
queried := convertReleaserToV1(t, rls[0])
if _, ok := queried.Labels["name"]; ok {
t.Fatalf("Expected 'name' system label to be filtered out, actual %v", queried.Labels)
}
_, err = cfgmaps.Query(map[string]string{"name": "notExist"}) _, err = cfgmaps.Query(map[string]string{"name": "notExist"})
if !errors.Is(err, ErrReleaseNotFound) { if !errors.Is(err, ErrReleaseNotFound) {
t.Errorf("Expected {%v}, got {%v}", ErrReleaseNotFound, err) t.Errorf("Expected {%v}, got {%v}", ErrReleaseNotFound, err)

@ -110,7 +110,7 @@ func (secrets *Secrets) List(filter func(release.Releaser) bool) ([]release.Rele
continue continue
} }
rls.Labels = item.Labels rls.Labels = filterSystemLabels(item.Labels)
if filter(rls) { if filter(rls) {
results = append(results, rls) results = append(results, rls)
@ -152,7 +152,7 @@ func (secrets *Secrets) Query(labels map[string]string) ([]release.Releaser, err
) )
continue continue
} }
rls.Labels = item.Labels rls.Labels = filterSystemLabels(item.Labels)
results = append(results, rls) results = append(results, rls)
} }
return results, nil return results, nil

@ -134,11 +134,12 @@ func TestSecretList(t *testing.T) {
if len(ssd) != 2 { if len(ssd) != 2 {
t.Errorf("Expected 2 superseded, got %d", len(ssd)) t.Errorf("Expected 2 superseded, got %d", len(ssd))
} }
// Check if release having both system and custom labels, this is needed to ensure that selector filtering would work. // List should return custom labels only, system labels (name, owner, status, etc.)
// must not leak into rls.Labels or they'll be carried into the next revision on upgrade.
rls := convertReleaserToV1(t, ssd[0]) rls := convertReleaserToV1(t, ssd[0])
_, ok := rls.Labels["name"] _, ok := rls.Labels["name"]
if !ok { if ok {
t.Fatalf("Expected 'name' label in results, actual %v", rls.Labels) t.Fatalf("Expected 'name' system label to be filtered out, actual %v", rls.Labels)
} }
_, ok = rls.Labels["key1"] _, ok = rls.Labels["key1"]
if !ok { if !ok {
@ -164,6 +165,12 @@ func TestSecretQuery(t *testing.T) {
t.Fatalf("Expected 2 results, actual %d", len(rls)) t.Fatalf("Expected 2 results, actual %d", len(rls))
} }
// Query should return custom labels only, same as Get and List.
queried := convertReleaserToV1(t, rls[0])
if _, ok := queried.Labels["name"]; ok {
t.Fatalf("Expected 'name' system label to be filtered out, actual %v", queried.Labels)
}
_, err = secrets.Query(map[string]string{"name": "notExist"}) _, err = secrets.Query(map[string]string{"name": "notExist"})
if !errors.Is(err, ErrReleaseNotFound) { if !errors.Is(err, ErrReleaseNotFound) {
t.Errorf("Expected {%v}, got {%v}", ErrReleaseNotFound, err) t.Errorf("Expected {%v}, got {%v}", ErrReleaseNotFound, err)

Loading…
Cancel
Save