Skip to content
This repository was archived by the owner on Dec 12, 2025. It is now read-only.

Commit ccec801

Browse files
Fix merging nil label selectors (#1195)
1 parent 1f56773 commit ccec801

File tree

2 files changed

+124
-1
lines changed

2 files changed

+124
-1
lines changed

pkg/kube/statefulset/merge_statefulset_test.go

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,126 @@ func TestMergeSpec(t *testing.T) {
159159
})
160160
})
161161
}
162+
163+
func TestMergeSpecLabelSelector(t *testing.T) {
164+
tests := []struct {
165+
name string
166+
original appsv1.StatefulSet
167+
override appsv1.StatefulSet
168+
expected *metav1.LabelSelector
169+
}{
170+
{
171+
name: "Empty label selectors in both sources",
172+
original: New(WithName("original")),
173+
override: New(WithName("override")),
174+
expected: nil,
175+
},
176+
{
177+
name: "Empty original label selector",
178+
original: New(WithName("original")),
179+
override: New(WithName("override"), WithSelector(&metav1.LabelSelector{
180+
MatchLabels: map[string]string{
181+
"a": "10",
182+
"b": "2",
183+
},
184+
})),
185+
expected: &metav1.LabelSelector{
186+
MatchLabels: map[string]string{
187+
"a": "10",
188+
"b": "2",
189+
},
190+
},
191+
},
192+
{
193+
name: "Empty override label selector",
194+
original: New(WithName("original"), WithSelector(&metav1.LabelSelector{
195+
MatchLabels: map[string]string{
196+
"a": "10",
197+
"b": "2",
198+
},
199+
})),
200+
override: New(WithName("override")),
201+
expected: &metav1.LabelSelector{
202+
MatchLabels: map[string]string{
203+
"a": "10",
204+
"b": "2",
205+
},
206+
},
207+
},
208+
{
209+
name: "Merge values label selectors from both resources",
210+
original: New(WithName("original"), WithSelector(&metav1.LabelSelector{
211+
MatchLabels: map[string]string{
212+
"a": "1",
213+
"b": "2",
214+
"c": "3",
215+
"e": "4",
216+
},
217+
MatchExpressions: []metav1.LabelSelectorRequirement{
218+
{
219+
Key: "key-0",
220+
Operator: metav1.LabelSelectorOpIn,
221+
Values: []string{"A", "B", "C"},
222+
},
223+
{
224+
Key: "key-2",
225+
Operator: metav1.LabelSelectorOpExists,
226+
Values: []string{"F", "D", "E"},
227+
},
228+
},
229+
})),
230+
override: New(WithName("override"), WithSelector(&metav1.LabelSelector{
231+
MatchLabels: map[string]string{
232+
"a": "10",
233+
"b": "2",
234+
"c": "30",
235+
"d": "40",
236+
},
237+
MatchExpressions: []metav1.LabelSelectorRequirement{
238+
{
239+
Key: "key-0",
240+
Operator: metav1.LabelSelectorOpDoesNotExist,
241+
Values: []string{"Z"},
242+
},
243+
{
244+
Key: "key-1",
245+
Operator: metav1.LabelSelectorOpExists,
246+
Values: []string{"A", "B", "C", "D"},
247+
},
248+
},
249+
})),
250+
expected: &metav1.LabelSelector{
251+
MatchLabels: map[string]string{
252+
"a": "10",
253+
"b": "2",
254+
"c": "30",
255+
"d": "40",
256+
"e": "4",
257+
},
258+
MatchExpressions: []metav1.LabelSelectorRequirement{
259+
{
260+
Key: "key-0",
261+
Operator: metav1.LabelSelectorOpDoesNotExist,
262+
Values: []string{"A", "B", "C", "Z"},
263+
},
264+
{
265+
Key: "key-1",
266+
Operator: metav1.LabelSelectorOpExists,
267+
Values: []string{"A", "B", "C", "D"},
268+
},
269+
{
270+
Key: "key-2",
271+
Operator: metav1.LabelSelectorOpExists,
272+
Values: []string{"D", "E", "F"},
273+
},
274+
},
275+
},
276+
},
277+
}
278+
for _, tt := range tests {
279+
t.Run(tt.name, func(t *testing.T) {
280+
mergedSpec := merge.StatefulSets(tt.original, tt.override)
281+
assert.Equal(t, tt.expected, mergedSpec.Spec.Selector)
282+
})
283+
}
284+
}

pkg/util/merge/merge_statefulset.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func LabelSelectors(originalLabelSelector, overrideLabelSelector *metav1.LabelSe
6565
}
6666
// we have only specified a label selector in the original
6767
if originalLabelSelector == nil {
68-
return originalLabelSelector
68+
return overrideLabelSelector
6969
}
7070

7171
// we have specified both, so we must merge them

0 commit comments

Comments
 (0)