Skip to content

Commit 79ff9d2

Browse files
committed
Change logic to prevent device-plugin daemonset spec change
Instead of adding a NodeSelectorRequirement per NodePolicy we add all the NodeSelectors to a single NodeSelectorRequirent so they can all be sorted. This will prevent that the daemonset's node selector changes when there are multiple NodePolicies applied. Signed-off-by: Alejandro Macedo <[email protected]>
1 parent 7e44c75 commit 79ff9d2

File tree

2 files changed

+31
-32
lines changed

2 files changed

+31
-32
lines changed

controllers/helper.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ func setDsNodeAffinity(pl *sriovnetworkv1.SriovNetworkNodePolicyList, ds *appsv1
281281
}
282282

283283
func nodeSelectorTermsForPolicyList(policies []sriovnetworkv1.SriovNetworkNodePolicy) []corev1.NodeSelectorTerm {
284-
terms := []corev1.NodeSelectorTerm{}
284+
expressions := []corev1.NodeSelectorRequirement{}
285285
for _, p := range policies {
286286
// Note(adrianc): default policy is deprecated and ignored.
287287
if p.Name == constants.DefaultPolicyName {
@@ -291,7 +291,7 @@ func nodeSelectorTermsForPolicyList(policies []sriovnetworkv1.SriovNetworkNodePo
291291
if len(p.Spec.NodeSelector) == 0 {
292292
continue
293293
}
294-
expressions := []corev1.NodeSelectorRequirement{}
294+
295295
for k, v := range p.Spec.NodeSelector {
296296
exp := corev1.NodeSelectorRequirement{
297297
Operator: corev1.NodeSelectorOpIn,
@@ -300,15 +300,20 @@ func nodeSelectorTermsForPolicyList(policies []sriovnetworkv1.SriovNetworkNodePo
300300
}
301301
expressions = append(expressions, exp)
302302
}
303-
// sorting is needed to keep the daemon spec stable.
304-
// the items are popped in a random order from the map
305-
sort.Slice(expressions, func(i, j int) bool {
306-
return expressions[i].Key < expressions[j].Key
307-
})
308-
nodeSelector := corev1.NodeSelectorTerm{
303+
}
304+
305+
// sorting is needed to keep the daemon spec stable.
306+
// the items are popped in a random order from the map
307+
sort.Slice(expressions, func(i, j int) bool {
308+
return expressions[i].Key < expressions[j].Key
309+
})
310+
311+
terms := []corev1.NodeSelectorTerm{}
312+
if len(expressions) > 0 {
313+
term := corev1.NodeSelectorTerm{
309314
MatchExpressions: expressions,
310315
}
311-
terms = append(terms, nodeSelector)
316+
terms = append(terms, term)
312317
}
313318

314319
return terms

controllers/helper_test.go

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,13 @@ func TestNodeSelectorMerge(t *testing.T) {
6464
MatchExpressions: []corev1.NodeSelectorRequirement{
6565
{
6666
Operator: corev1.NodeSelectorOpIn,
67-
Key: "foo",
68-
Values: []string{"bar"},
67+
Key: "bb",
68+
Values: []string{"cc"},
6969
},
70-
},
71-
},
72-
{
73-
MatchExpressions: []corev1.NodeSelectorRequirement{
7470
{
7571
Operator: corev1.NodeSelectorOpIn,
76-
Key: "bb",
77-
Values: []string{"cc"},
72+
Key: "foo",
73+
Values: []string{"bar"},
7874
},
7975
},
8076
},
@@ -102,20 +98,6 @@ func TestNodeSelectorMerge(t *testing.T) {
10298
},
10399
},
104100
expected: []corev1.NodeSelectorTerm{
105-
{
106-
MatchExpressions: []corev1.NodeSelectorRequirement{
107-
{
108-
Operator: corev1.NodeSelectorOpIn,
109-
Key: "foo",
110-
Values: []string{"bar"},
111-
},
112-
{
113-
Operator: corev1.NodeSelectorOpIn,
114-
Key: "foo1",
115-
Values: []string{"bar1"},
116-
},
117-
},
118-
},
119101
{
120102
MatchExpressions: []corev1.NodeSelectorRequirement{
121103
{
@@ -133,6 +115,16 @@ func TestNodeSelectorMerge(t *testing.T) {
133115
Key: "bb2",
134116
Values: []string{"cc2"},
135117
},
118+
{
119+
Operator: corev1.NodeSelectorOpIn,
120+
Key: "foo",
121+
Values: []string{"bar"},
122+
},
123+
{
124+
Operator: corev1.NodeSelectorOpIn,
125+
Key: "foo1",
126+
Values: []string{"bar1"},
127+
},
136128
},
137129
},
138130
},
@@ -254,6 +246,7 @@ var _ = Describe("Helper Validation", Ordered, func() {
254246
Expect(in.Spec.Template.Spec.Affinity.NodeAffinity).ToNot(BeNil())
255247
Expect(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution).ToNot(BeNil())
256248
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms)).To(Equal(1))
249+
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions)).To(Equal(1))
257250
})
258251
It("should update affinity with multiple", func() {
259252
pl := &sriovnetworkv1.SriovNetworkNodePolicyList{Items: []sriovnetworkv1.SriovNetworkNodePolicy{
@@ -285,7 +278,8 @@ var _ = Describe("Helper Validation", Ordered, func() {
285278
Expect(in.Spec.Template.Spec.Affinity).ToNot(BeNil())
286279
Expect(in.Spec.Template.Spec.Affinity.NodeAffinity).ToNot(BeNil())
287280
Expect(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution).ToNot(BeNil())
288-
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms)).To(Equal(2))
281+
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms)).To(Equal(1))
282+
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions)).To(Equal(2))
289283
})
290284
It("should switch affinity", func() {
291285
pl := &sriovnetworkv1.SriovNetworkNodePolicyList{Items: []sriovnetworkv1.SriovNetworkNodePolicy{

0 commit comments

Comments
 (0)