Skip to content

Commit 89c51d0

Browse files
alacukupoiana
authored andcommitted
fix: include selector labels in pod template labels
Use forgePodTemplateSpecLabels() to ensure pod template labels always contain the required selector labels, fixing the validation error where selector would not match template labels. Signed-off-by: alacuku <aldo@lacuku.eu>
1 parent fc96dcc commit 89c51d0

2 files changed

Lines changed: 25 additions & 7 deletions

File tree

internal/pkg/resources/overlays.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323
corev1 "k8s.io/api/core/v1"
2424
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2525
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
26-
"k8s.io/apimachinery/pkg/labels"
2726
"k8s.io/apimachinery/pkg/runtime"
2827
"sigs.k8s.io/controller-runtime/pkg/client"
2928

@@ -142,7 +141,7 @@ func GenerateUserOverlay(resourceType, name string, defs *InstanceDefaults, opts
142141
dep.Spec.Template = corev1.PodTemplateSpec{}
143142
}
144143
if cfg.labels != nil {
145-
dep.Spec.Template.Labels = labels.Merge(dep.Spec.Template.Labels, cfg.labels)
144+
dep.Spec.Template.Labels = forgePodTemplateSpecLabels(name, cfg.labels)
146145
}
147146
if cfg.strategy != nil {
148147
dep.Spec.Strategy = *cfg.strategy
@@ -164,7 +163,7 @@ func GenerateUserOverlay(resourceType, name string, defs *InstanceDefaults, opts
164163
ds.Spec.Template = corev1.PodTemplateSpec{}
165164
}
166165
if cfg.labels != nil {
167-
ds.Spec.Template.Labels = labels.Merge(ds.Spec.Template.Labels, cfg.labels)
166+
ds.Spec.Template.Labels = forgePodTemplateSpecLabels(name, cfg.labels)
168167
}
169168
if cfg.updateStrategy != nil {
170169
ds.Spec.UpdateStrategy = *cfg.updateStrategy

internal/pkg/resources/overlays_test.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,24 @@ func TestGenerateOverlayOptions(t *testing.T) {
9696
resourceType: ResourceTypeDaemonSet,
9797
wantLabels: map[string]string{"app": "falco"},
9898
},
99+
{
100+
name: "Falco with conflicting selector labels, selector labels take precedence in pod template",
101+
obj: builders.NewFalco().
102+
WithName("falco-custom").WithNamespace(testNamespace).
103+
WithLabels(map[string]string{
104+
"app.kubernetes.io/name": "falco-operator",
105+
"app.kubernetes.io/instance": "instance-1",
106+
}).
107+
Build(),
108+
defs: FalcoDefaults,
109+
resourceType: ResourceTypeDaemonSet,
110+
// In pod template, selector labels (name, instance) override user labels.
111+
// Non-conflicting user labels (managed-by) are preserved.
112+
wantLabels: map[string]string{
113+
"app.kubernetes.io/name": "falco-operator",
114+
"app.kubernetes.io/instance": "instance-1",
115+
},
116+
},
99117
{
100118
name: "Component with defaults only produces labels option",
101119
obj: builders.NewComponent().
@@ -164,18 +182,19 @@ func TestGenerateOverlayOptions(t *testing.T) {
164182
for _, tt := range tests {
165183
t.Run(tt.name, func(t *testing.T) {
166184
opts := GenerateOverlayOptions(tt.obj)
167-
overlay, err := GenerateUserOverlay(tt.resourceType, "test", tt.defs, opts...)
185+
overlay, err := GenerateUserOverlay(tt.resourceType, tt.obj.GetName(), tt.defs, opts...)
168186
require.NoError(t, err)
169187
require.NotNil(t, overlay)
170188

171189
// Labels propagate to metadata and pod template.
172190
for k, v := range tt.wantLabels {
173191
assert.Equal(t, v, overlay.GetLabels()[k], "metadata label %s", k)
174192
}
193+
194+
// Assert that pod template labels include the expected labels (selector labels take precedence over user labels).
175195
templateLabels, _, _ := unstructured.NestedStringMap(overlay.Object, "spec", "template", "metadata", "labels")
176-
for k, v := range tt.wantLabels {
177-
assert.Equal(t, v, templateLabels[k], "pod template label %s", k)
178-
}
196+
assert.Equal(t, tt.obj.GetName(), templateLabels["app.kubernetes.io/instance"], "pod template label app.kubernetes.io/instance should match object name")
197+
assert.Equal(t, tt.obj.GetName(), templateLabels["app.kubernetes.io/name"], "pod template label app.kubernetes.io/name should match object name")
179198

180199
// Replicas.
181200
if tt.wantReplicas > 0 {

0 commit comments

Comments
 (0)