Skip to content

Commit b43d4a8

Browse files
yevgeny-shnaidmank8s-ci-robot
authored andcommitted
Fixing node events propagated to the module reconciler
Currently module reconciler is watching for events on the Node and skips deletions, creations, generics event. On the Update event is looks for labels' changes or that the node becomes schedulable based on the taints. Since filter does not know the tolerations of the Modules, all this code actually does is check if tolerations exist, then check if if tolerations allow scheduling and then checking if there is a difference between new and old conditions in schelabilty of those conditions, and only in that case the module reconciler is scheduled. This means that when the node rebooted, and the node is tainted with the taints whose effect is notSchedule, the module reconciler will never be kicked in, even though there is a Module has a matching toleration. This commit changes the condition for the Module reconciler to be scheduled: no module reconciler will be scheduled in case there is a change in labels, or a change in taints. This means that as the node progesses from NotReady to Ready and visa-versa, the Module reconciler will be notified
1 parent 85e0eb7 commit b43d4a8

File tree

2 files changed

+20
-87
lines changed

2 files changed

+20
-87
lines changed

internal/filter/filter.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package filter
33
import (
44
"context"
55
"github.com/go-logr/logr"
6-
"github.com/kubernetes-sigs/kernel-module-management/internal/node"
76
v1 "k8s.io/api/core/v1"
87
"k8s.io/apimachinery/pkg/types"
98
"k8s.io/apimachinery/pkg/util/sets"
@@ -37,7 +36,7 @@ var skipCreations predicate.Predicate = predicate.Funcs{
3736
CreateFunc: func(_ event.CreateEvent) bool { return false },
3837
}
3938

40-
var nodeBecomesSchedulable predicate.Predicate = predicate.Funcs{
39+
var nodeTaintsChanged predicate.Predicate = predicate.Funcs{
4140
UpdateFunc: func(e event.UpdateEvent) bool {
4241
oldNode, ok := e.ObjectOld.(*v1.Node)
4342
if !ok {
@@ -49,10 +48,7 @@ var nodeBecomesSchedulable predicate.Predicate = predicate.Funcs{
4948
return false
5049
}
5150

52-
n := node.NewNode(nil)
53-
isOldSchedulable := n.IsNodeSchedulable(oldNode, nil)
54-
isNewSchedulable := n.IsNodeSchedulable(newNode, nil)
55-
if isOldSchedulable != isNewSchedulable && isNewSchedulable {
51+
if !reflect.DeepEqual(newNode.Spec.Taints, oldNode.Spec.Taints) {
5652
return true
5753
}
5854

@@ -117,14 +113,6 @@ func New(client client.Client, nmcHelper nmc.Helper) *Filter {
117113
}
118114
}
119115

120-
func (f *Filter) ModuleReconcilerNodePredicate(kernelLabel string) predicate.Predicate {
121-
return predicate.And(
122-
skipDeletions,
123-
HasLabel(kernelLabel),
124-
predicate.Or(nodeBecomesSchedulable, predicate.LabelChangedPredicate{}),
125-
)
126-
}
127-
128116
func ListModulesForNMC(_ context.Context, obj client.Object) []reconcile.Request {
129117
modules := sets.New[reconcile.Request]()
130118

@@ -195,7 +183,7 @@ func NMCReconcilerNodePredicate() predicate.Predicate {
195183
func ModuleReconcilerNodePredicate() predicate.Predicate {
196184
return predicate.And(
197185
skipDeletions,
198-
predicate.Or(nodeBecomesSchedulable, predicate.LabelChangedPredicate{}),
186+
predicate.Or(nodeTaintsChanged, predicate.LabelChangedPredicate{}),
199187
)
200188
}
201189

internal/filter/filter_test.go

Lines changed: 17 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -83,36 +83,6 @@ var _ = Describe("skipCreations", func() {
8383
})
8484
})
8585

86-
var _ = Describe("nodeBecomesSchedulable", func() {
87-
DescribeTable("should work as expected", func(oldNodeSchedulable, newNodeSchedulable, expectedRes bool) {
88-
oldNode := v1.Node{}
89-
newNode := v1.Node{}
90-
if !oldNodeSchedulable {
91-
oldNode.Spec.Taints = []v1.Taint{
92-
v1.Taint{
93-
Effect: v1.TaintEffectNoSchedule,
94-
},
95-
}
96-
}
97-
if !newNodeSchedulable {
98-
newNode.Spec.Taints = []v1.Taint{
99-
v1.Taint{
100-
Effect: v1.TaintEffectNoSchedule,
101-
},
102-
}
103-
}
104-
105-
res := nodeBecomesSchedulable.Update(event.UpdateEvent{ObjectOld: &oldNode, ObjectNew: &newNode})
106-
Expect(res).To(Equal(expectedRes))
107-
108-
},
109-
Entry("old schedulable, new schedulable", true, true, false),
110-
Entry("old schedulable, new non-schedulable", true, false, false),
111-
Entry("old non-schedulable, new non-schedulable", false, false, false),
112-
Entry("old non-schedulable, new schedulable", false, true, true),
113-
)
114-
})
115-
11686
var _ = Describe("filterRelevantNodeUpdates", func() {
11787

11888
It("should return false if there's no relevant change", func() {
@@ -338,21 +308,15 @@ var _ = Describe("ListModulesForNMC", func() {
338308
})
339309

340310
var _ = Describe("ModuleReconcilerNodePredicate", func() {
341-
const kernelLabel = "kernel-label"
342311
var p predicate.Predicate
343312

344313
BeforeEach(func() {
345-
f = New(nil, nil)
346-
p = f.ModuleReconcilerNodePredicate(kernelLabel)
314+
p = ModuleReconcilerNodePredicate()
347315
})
348316

349317
It("should return true for creations", func() {
350318
ev := event.CreateEvent{
351-
Object: &v1.Node{
352-
ObjectMeta: metav1.ObjectMeta{
353-
Labels: map[string]string{kernelLabel: "1.2.3"},
354-
},
355-
},
319+
Object: &v1.Node{},
356320
}
357321

358322
Expect(
@@ -367,7 +331,7 @@ var _ = Describe("ModuleReconcilerNodePredicate", func() {
367331
ObjectOld: &v1.Node{},
368332
ObjectNew: &v1.Node{
369333
ObjectMeta: metav1.ObjectMeta{
370-
Labels: map[string]string{kernelLabel: "1.2.3"},
334+
Labels: map[string]string{"some label": "some value"},
371335
},
372336
},
373337
}
@@ -378,34 +342,9 @@ var _ = Describe("ModuleReconcilerNodePredicate", func() {
378342
BeTrue(),
379343
)
380344
})
381-
It("should return false for label updates without the expected label", func() {
382-
ev := event.UpdateEvent{
383-
ObjectOld: &v1.Node{
384-
ObjectMeta: metav1.ObjectMeta{
385-
Labels: map[string]string{"a": "b"},
386-
},
387-
},
388-
ObjectNew: &v1.Node{
389-
ObjectMeta: metav1.ObjectMeta{
390-
Labels: map[string]string{"c": "d"},
391-
},
392-
},
393-
}
394-
395-
Expect(
396-
p.Update(ev),
397-
).To(
398-
BeFalse(),
399-
)
400-
})
401-
402345
It("should return false for deletions", func() {
403346
ev := event.DeleteEvent{
404-
Object: &v1.Node{
405-
ObjectMeta: metav1.ObjectMeta{
406-
Labels: map[string]string{kernelLabel: "1.2.3"},
407-
},
408-
},
347+
Object: &v1.Node{},
409348
}
410349

411350
Expect(
@@ -880,7 +819,7 @@ var _ = Describe("FindPreflightsForModule", func() {
880819

881820
})
882821

883-
var _ = Describe("nodeBecomesSchedulable", func() {
822+
var _ = Describe("nodeTaintsChanged", func() {
884823
var (
885824
oldNode v1.Node
886825
newNode *v1.Node
@@ -900,9 +839,16 @@ var _ = Describe("nodeBecomesSchedulable", func() {
900839
newNode = oldNode.DeepCopy()
901840
})
902841

903-
nonSchedulableTaint := v1.Taint{
842+
taint1 := v1.Taint{
843+
Key: "key1",
844+
Value: "value1",
904845
Effect: v1.TaintEffectNoSchedule,
905846
}
847+
taint2 := v1.Taint{
848+
Key: "key2",
849+
Value: "value2",
850+
Effect: v1.TaintEffectPreferNoSchedule,
851+
}
906852

907853
DescribeTable("Should return the expected value", func(oldTaint *v1.Taint, newTaint *v1.Taint, expected bool) {
908854
if newTaint != nil {
@@ -912,16 +858,15 @@ var _ = Describe("nodeBecomesSchedulable", func() {
912858
oldNode.Spec.Taints = append(oldNode.Spec.Taints, *oldTaint)
913859
}
914860

915-
res := nodeBecomesSchedulable.Update(event.UpdateEvent{ObjectOld: &oldNode, ObjectNew: newNode})
861+
res := nodeTaintsChanged.Update(event.UpdateEvent{ObjectOld: &oldNode, ObjectNew: newNode})
916862
if expected {
917863
Expect(res).To(BeTrue())
918864
} else {
919865
Expect(res).To(BeFalse())
920866
}
921867
},
922-
Entry("old Schedulable, new Schedulable", nil, nil, false),
923-
Entry("old NonSchedulable, new NonSchedulable", &nonSchedulableTaint, &nonSchedulableTaint, false),
924-
Entry("old Schedulable, new NonSchedulable", nil, &nonSchedulableTaint, false),
925-
Entry("old NonSchedulable, new Schedulable", &nonSchedulableTaint, nil, true),
868+
Entry("no old taints, no new taints", nil, nil, false),
869+
Entry("taints are different between old and new", &taint1, &taint2, true),
870+
Entry("taints are equal between old and new", &taint2, &taint2, false),
926871
)
927872
})

0 commit comments

Comments
 (0)