Skip to content

Commit

Permalink
Change logic to prevent device-plugin daemonset spec change
Browse files Browse the repository at this point in the history
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 <alex.macedopereira@gmail.com>
  • Loading branch information
AMacedoP committed Jul 19, 2024
1 parent 7e44c75 commit 79ff9d2
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 32 deletions.
23 changes: 14 additions & 9 deletions controllers/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ func setDsNodeAffinity(pl *sriovnetworkv1.SriovNetworkNodePolicyList, ds *appsv1
}

func nodeSelectorTermsForPolicyList(policies []sriovnetworkv1.SriovNetworkNodePolicy) []corev1.NodeSelectorTerm {
terms := []corev1.NodeSelectorTerm{}
expressions := []corev1.NodeSelectorRequirement{}
for _, p := range policies {
// Note(adrianc): default policy is deprecated and ignored.
if p.Name == constants.DefaultPolicyName {
Expand All @@ -291,7 +291,7 @@ func nodeSelectorTermsForPolicyList(policies []sriovnetworkv1.SriovNetworkNodePo
if len(p.Spec.NodeSelector) == 0 {
continue
}
expressions := []corev1.NodeSelectorRequirement{}

for k, v := range p.Spec.NodeSelector {
exp := corev1.NodeSelectorRequirement{
Operator: corev1.NodeSelectorOpIn,
Expand All @@ -300,15 +300,20 @@ func nodeSelectorTermsForPolicyList(policies []sriovnetworkv1.SriovNetworkNodePo
}
expressions = append(expressions, exp)
}
// sorting is needed to keep the daemon spec stable.
// the items are popped in a random order from the map
sort.Slice(expressions, func(i, j int) bool {
return expressions[i].Key < expressions[j].Key
})
nodeSelector := corev1.NodeSelectorTerm{
}

// sorting is needed to keep the daemon spec stable.
// the items are popped in a random order from the map
sort.Slice(expressions, func(i, j int) bool {
return expressions[i].Key < expressions[j].Key
})

terms := []corev1.NodeSelectorTerm{}
if len(expressions) > 0 {
term := corev1.NodeSelectorTerm{
MatchExpressions: expressions,
}
terms = append(terms, nodeSelector)
terms = append(terms, term)
}

return terms
Expand Down
40 changes: 17 additions & 23 deletions controllers/helper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,17 +64,13 @@ func TestNodeSelectorMerge(t *testing.T) {
MatchExpressions: []corev1.NodeSelectorRequirement{
{
Operator: corev1.NodeSelectorOpIn,
Key: "foo",
Values: []string{"bar"},
Key: "bb",
Values: []string{"cc"},
},
},
},
{
MatchExpressions: []corev1.NodeSelectorRequirement{
{
Operator: corev1.NodeSelectorOpIn,
Key: "bb",
Values: []string{"cc"},
Key: "foo",
Values: []string{"bar"},
},
},
},
Expand Down Expand Up @@ -102,20 +98,6 @@ func TestNodeSelectorMerge(t *testing.T) {
},
},
expected: []corev1.NodeSelectorTerm{
{
MatchExpressions: []corev1.NodeSelectorRequirement{
{
Operator: corev1.NodeSelectorOpIn,
Key: "foo",
Values: []string{"bar"},
},
{
Operator: corev1.NodeSelectorOpIn,
Key: "foo1",
Values: []string{"bar1"},
},
},
},
{
MatchExpressions: []corev1.NodeSelectorRequirement{
{
Expand All @@ -133,6 +115,16 @@ func TestNodeSelectorMerge(t *testing.T) {
Key: "bb2",
Values: []string{"cc2"},
},
{
Operator: corev1.NodeSelectorOpIn,
Key: "foo",
Values: []string{"bar"},
},
{
Operator: corev1.NodeSelectorOpIn,
Key: "foo1",
Values: []string{"bar1"},
},
},
},
},
Expand Down Expand Up @@ -254,6 +246,7 @@ var _ = Describe("Helper Validation", Ordered, func() {
Expect(in.Spec.Template.Spec.Affinity.NodeAffinity).ToNot(BeNil())
Expect(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution).ToNot(BeNil())
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms)).To(Equal(1))
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions)).To(Equal(1))
})
It("should update affinity with multiple", func() {
pl := &sriovnetworkv1.SriovNetworkNodePolicyList{Items: []sriovnetworkv1.SriovNetworkNodePolicy{
Expand Down Expand Up @@ -285,7 +278,8 @@ var _ = Describe("Helper Validation", Ordered, func() {
Expect(in.Spec.Template.Spec.Affinity).ToNot(BeNil())
Expect(in.Spec.Template.Spec.Affinity.NodeAffinity).ToNot(BeNil())
Expect(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution).ToNot(BeNil())
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms)).To(Equal(2))
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms)).To(Equal(1))
Expect(len(in.Spec.Template.Spec.Affinity.NodeAffinity.RequiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms[0].MatchExpressions)).To(Equal(2))
})
It("should switch affinity", func() {
pl := &sriovnetworkv1.SriovNetworkNodePolicyList{Items: []sriovnetworkv1.SriovNetworkNodePolicy{
Expand Down

0 comments on commit 79ff9d2

Please sign in to comment.