Skip to content

Commit bae5979

Browse files
authored
Merge pull request kubernetes#126050 from sanposhiho/refactor-move
cleanup: refactor the way extracting Node smaller events
2 parents d11e860 + fe96bfa commit bae5979

File tree

4 files changed

+348
-304
lines changed

4 files changed

+348
-304
lines changed

pkg/scheduler/eventhandlers.go

Lines changed: 1 addition & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424

2525
v1 "k8s.io/api/core/v1"
2626
storagev1 "k8s.io/api/storage/v1"
27-
"k8s.io/apimachinery/pkg/api/equality"
2827
"k8s.io/apimachinery/pkg/runtime/schema"
2928
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
3029
"k8s.io/apimachinery/pkg/util/wait"
@@ -94,7 +93,7 @@ func (sched *Scheduler) updateNodeInCache(oldObj, newObj interface{}) {
9493
logger.V(4).Info("Update event for node", "node", klog.KObj(newNode))
9594
nodeInfo := sched.Cache.UpdateNode(logger, oldNode, newNode)
9695
// Only requeue unschedulable pods if the node became more schedulable.
97-
for _, evt := range nodeSchedulingPropertiesChange(newNode, oldNode) {
96+
for _, evt := range queue.NodeSchedulingPropertiesChange(newNode, oldNode) {
9897
sched.SchedulingQueue.MoveAllToActiveOrBackoffQueue(logger, evt, oldNode, newNode, preCheckForNode(nodeInfo))
9998
}
10099
}
@@ -571,62 +570,6 @@ func addAllEventHandlers(
571570
return nil
572571
}
573572

574-
func nodeSchedulingPropertiesChange(newNode *v1.Node, oldNode *v1.Node) []framework.ClusterEvent {
575-
var events []framework.ClusterEvent
576-
577-
if nodeSpecUnschedulableChanged(newNode, oldNode) {
578-
events = append(events, queue.NodeSpecUnschedulableChange)
579-
}
580-
if nodeAllocatableChanged(newNode, oldNode) {
581-
events = append(events, queue.NodeAllocatableChange)
582-
}
583-
if nodeLabelsChanged(newNode, oldNode) {
584-
events = append(events, queue.NodeLabelChange)
585-
}
586-
if nodeTaintsChanged(newNode, oldNode) {
587-
events = append(events, queue.NodeTaintChange)
588-
}
589-
if nodeConditionsChanged(newNode, oldNode) {
590-
events = append(events, queue.NodeConditionChange)
591-
}
592-
if nodeAnnotationsChanged(newNode, oldNode) {
593-
events = append(events, queue.NodeAnnotationChange)
594-
}
595-
596-
return events
597-
}
598-
599-
func nodeAllocatableChanged(newNode *v1.Node, oldNode *v1.Node) bool {
600-
return !equality.Semantic.DeepEqual(oldNode.Status.Allocatable, newNode.Status.Allocatable)
601-
}
602-
603-
func nodeLabelsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
604-
return !equality.Semantic.DeepEqual(oldNode.GetLabels(), newNode.GetLabels())
605-
}
606-
607-
func nodeTaintsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
608-
return !equality.Semantic.DeepEqual(newNode.Spec.Taints, oldNode.Spec.Taints)
609-
}
610-
611-
func nodeConditionsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
612-
strip := func(conditions []v1.NodeCondition) map[v1.NodeConditionType]v1.ConditionStatus {
613-
conditionStatuses := make(map[v1.NodeConditionType]v1.ConditionStatus, len(conditions))
614-
for i := range conditions {
615-
conditionStatuses[conditions[i].Type] = conditions[i].Status
616-
}
617-
return conditionStatuses
618-
}
619-
return !equality.Semantic.DeepEqual(strip(oldNode.Status.Conditions), strip(newNode.Status.Conditions))
620-
}
621-
622-
func nodeSpecUnschedulableChanged(newNode *v1.Node, oldNode *v1.Node) bool {
623-
return newNode.Spec.Unschedulable != oldNode.Spec.Unschedulable && !newNode.Spec.Unschedulable
624-
}
625-
626-
func nodeAnnotationsChanged(newNode *v1.Node, oldNode *v1.Node) bool {
627-
return !equality.Semantic.DeepEqual(oldNode.GetAnnotations(), newNode.GetAnnotations())
628-
}
629-
630573
func preCheckForNode(nodeInfo *framework.NodeInfo) queue.PreEnqueueCheck {
631574
// Note: the following checks doesn't take preemption into considerations, in very rare
632575
// cases (e.g., node resizing), "pod" may still fail a check but preemption helps. We deliberately

pkg/scheduler/eventhandlers_test.go

Lines changed: 0 additions & 240 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
resourcev1alpha2 "k8s.io/api/resource/v1alpha2"
3030
storagev1 "k8s.io/api/storage/v1"
3131
"k8s.io/apimachinery/pkg/api/resource"
32-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3332
utilfeature "k8s.io/apiserver/pkg/util/feature"
3433
featuregatetesting "k8s.io/component-base/featuregate/testing"
3534
"k8s.io/klog/v2/ktesting"
@@ -53,157 +52,6 @@ import (
5352
"k8s.io/kubernetes/pkg/scheduler/util/assumecache"
5453
)
5554

56-
func TestNodeAllocatableChanged(t *testing.T) {
57-
newQuantity := func(value int64) resource.Quantity {
58-
return *resource.NewQuantity(value, resource.BinarySI)
59-
}
60-
for _, test := range []struct {
61-
Name string
62-
Changed bool
63-
OldAllocatable v1.ResourceList
64-
NewAllocatable v1.ResourceList
65-
}{
66-
{
67-
Name: "no allocatable resources changed",
68-
Changed: false,
69-
OldAllocatable: v1.ResourceList{v1.ResourceMemory: newQuantity(1024)},
70-
NewAllocatable: v1.ResourceList{v1.ResourceMemory: newQuantity(1024)},
71-
},
72-
{
73-
Name: "new node has more allocatable resources",
74-
Changed: true,
75-
OldAllocatable: v1.ResourceList{v1.ResourceMemory: newQuantity(1024)},
76-
NewAllocatable: v1.ResourceList{v1.ResourceMemory: newQuantity(1024), v1.ResourceStorage: newQuantity(1024)},
77-
},
78-
} {
79-
t.Run(test.Name, func(t *testing.T) {
80-
oldNode := &v1.Node{Status: v1.NodeStatus{Allocatable: test.OldAllocatable}}
81-
newNode := &v1.Node{Status: v1.NodeStatus{Allocatable: test.NewAllocatable}}
82-
changed := nodeAllocatableChanged(newNode, oldNode)
83-
if changed != test.Changed {
84-
t.Errorf("nodeAllocatableChanged should be %t, got %t", test.Changed, changed)
85-
}
86-
})
87-
}
88-
}
89-
90-
func TestNodeLabelsChanged(t *testing.T) {
91-
for _, test := range []struct {
92-
Name string
93-
Changed bool
94-
OldLabels map[string]string
95-
NewLabels map[string]string
96-
}{
97-
{
98-
Name: "no labels changed",
99-
Changed: false,
100-
OldLabels: map[string]string{"foo": "bar"},
101-
NewLabels: map[string]string{"foo": "bar"},
102-
},
103-
// Labels changed.
104-
{
105-
Name: "new node has more labels",
106-
Changed: true,
107-
OldLabels: map[string]string{"foo": "bar"},
108-
NewLabels: map[string]string{"foo": "bar", "test": "value"},
109-
},
110-
} {
111-
t.Run(test.Name, func(t *testing.T) {
112-
oldNode := &v1.Node{ObjectMeta: metav1.ObjectMeta{Labels: test.OldLabels}}
113-
newNode := &v1.Node{ObjectMeta: metav1.ObjectMeta{Labels: test.NewLabels}}
114-
changed := nodeLabelsChanged(newNode, oldNode)
115-
if changed != test.Changed {
116-
t.Errorf("Test case %q failed: should be %t, got %t", test.Name, test.Changed, changed)
117-
}
118-
})
119-
}
120-
}
121-
122-
func TestNodeTaintsChanged(t *testing.T) {
123-
for _, test := range []struct {
124-
Name string
125-
Changed bool
126-
OldTaints []v1.Taint
127-
NewTaints []v1.Taint
128-
}{
129-
{
130-
Name: "no taint changed",
131-
Changed: false,
132-
OldTaints: []v1.Taint{{Key: "key", Value: "value"}},
133-
NewTaints: []v1.Taint{{Key: "key", Value: "value"}},
134-
},
135-
{
136-
Name: "taint value changed",
137-
Changed: true,
138-
OldTaints: []v1.Taint{{Key: "key", Value: "value1"}},
139-
NewTaints: []v1.Taint{{Key: "key", Value: "value2"}},
140-
},
141-
} {
142-
t.Run(test.Name, func(t *testing.T) {
143-
oldNode := &v1.Node{Spec: v1.NodeSpec{Taints: test.OldTaints}}
144-
newNode := &v1.Node{Spec: v1.NodeSpec{Taints: test.NewTaints}}
145-
changed := nodeTaintsChanged(newNode, oldNode)
146-
if changed != test.Changed {
147-
t.Errorf("Test case %q failed: should be %t, not %t", test.Name, test.Changed, changed)
148-
}
149-
})
150-
}
151-
}
152-
153-
func TestNodeConditionsChanged(t *testing.T) {
154-
nodeConditionType := reflect.TypeOf(v1.NodeCondition{})
155-
if nodeConditionType.NumField() != 6 {
156-
t.Errorf("NodeCondition type has changed. The nodeConditionsChanged() function must be reevaluated.")
157-
}
158-
159-
for _, test := range []struct {
160-
Name string
161-
Changed bool
162-
OldConditions []v1.NodeCondition
163-
NewConditions []v1.NodeCondition
164-
}{
165-
{
166-
Name: "no condition changed",
167-
Changed: false,
168-
OldConditions: []v1.NodeCondition{{Type: v1.NodeDiskPressure, Status: v1.ConditionTrue}},
169-
NewConditions: []v1.NodeCondition{{Type: v1.NodeDiskPressure, Status: v1.ConditionTrue}},
170-
},
171-
{
172-
Name: "only LastHeartbeatTime changed",
173-
Changed: false,
174-
OldConditions: []v1.NodeCondition{{Type: v1.NodeDiskPressure, Status: v1.ConditionTrue, LastHeartbeatTime: metav1.Unix(1, 0)}},
175-
NewConditions: []v1.NodeCondition{{Type: v1.NodeDiskPressure, Status: v1.ConditionTrue, LastHeartbeatTime: metav1.Unix(2, 0)}},
176-
},
177-
{
178-
Name: "new node has more healthy conditions",
179-
Changed: true,
180-
OldConditions: []v1.NodeCondition{},
181-
NewConditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}},
182-
},
183-
{
184-
Name: "new node has less unhealthy conditions",
185-
Changed: true,
186-
OldConditions: []v1.NodeCondition{{Type: v1.NodeDiskPressure, Status: v1.ConditionTrue}},
187-
NewConditions: []v1.NodeCondition{},
188-
},
189-
{
190-
Name: "condition status changed",
191-
Changed: true,
192-
OldConditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionFalse}},
193-
NewConditions: []v1.NodeCondition{{Type: v1.NodeReady, Status: v1.ConditionTrue}},
194-
},
195-
} {
196-
t.Run(test.Name, func(t *testing.T) {
197-
oldNode := &v1.Node{Status: v1.NodeStatus{Conditions: test.OldConditions}}
198-
newNode := &v1.Node{Status: v1.NodeStatus{Conditions: test.NewConditions}}
199-
changed := nodeConditionsChanged(newNode, oldNode)
200-
if changed != test.Changed {
201-
t.Errorf("Test case %q failed: should be %t, got %t", test.Name, test.Changed, changed)
202-
}
203-
})
204-
}
205-
}
206-
20755
func TestUpdatePodInCache(t *testing.T) {
20856
ttl := 10 * time.Second
20957
nodeName := "node"
@@ -574,91 +422,3 @@ func TestAdmissionCheck(t *testing.T) {
574422
})
575423
}
576424
}
577-
578-
func TestNodeSchedulingPropertiesChange(t *testing.T) {
579-
testCases := []struct {
580-
name string
581-
newNode *v1.Node
582-
oldNode *v1.Node
583-
wantEvents []framework.ClusterEvent
584-
}{
585-
{
586-
name: "no specific changed applied",
587-
newNode: st.MakeNode().Unschedulable(false).Obj(),
588-
oldNode: st.MakeNode().Unschedulable(false).Obj(),
589-
wantEvents: nil,
590-
},
591-
{
592-
name: "only node spec unavailable changed",
593-
newNode: st.MakeNode().Unschedulable(false).Obj(),
594-
oldNode: st.MakeNode().Unschedulable(true).Obj(),
595-
wantEvents: []framework.ClusterEvent{queue.NodeSpecUnschedulableChange},
596-
},
597-
{
598-
name: "only node allocatable changed",
599-
newNode: st.MakeNode().Capacity(map[v1.ResourceName]string{
600-
v1.ResourceCPU: "1000m",
601-
v1.ResourceMemory: "100m",
602-
v1.ResourceName("example.com/foo"): "1"},
603-
).Obj(),
604-
oldNode: st.MakeNode().Capacity(map[v1.ResourceName]string{
605-
v1.ResourceCPU: "1000m",
606-
v1.ResourceMemory: "100m",
607-
v1.ResourceName("example.com/foo"): "2"},
608-
).Obj(),
609-
wantEvents: []framework.ClusterEvent{queue.NodeAllocatableChange},
610-
},
611-
{
612-
name: "only node label changed",
613-
newNode: st.MakeNode().Label("foo", "bar").Obj(),
614-
oldNode: st.MakeNode().Label("foo", "fuz").Obj(),
615-
wantEvents: []framework.ClusterEvent{queue.NodeLabelChange},
616-
},
617-
{
618-
name: "only node taint changed",
619-
newNode: st.MakeNode().Taints([]v1.Taint{
620-
{Key: v1.TaintNodeUnschedulable, Value: "", Effect: v1.TaintEffectNoSchedule},
621-
}).Obj(),
622-
oldNode: st.MakeNode().Taints([]v1.Taint{
623-
{Key: v1.TaintNodeUnschedulable, Value: "foo", Effect: v1.TaintEffectNoSchedule},
624-
}).Obj(),
625-
wantEvents: []framework.ClusterEvent{queue.NodeTaintChange},
626-
},
627-
{
628-
name: "only node annotation changed",
629-
newNode: st.MakeNode().Annotation("foo", "bar").Obj(),
630-
oldNode: st.MakeNode().Annotation("foo", "fuz").Obj(),
631-
wantEvents: []framework.ClusterEvent{queue.NodeAnnotationChange},
632-
},
633-
{
634-
name: "only node condition changed",
635-
newNode: st.MakeNode().Obj(),
636-
oldNode: st.MakeNode().Condition(
637-
v1.NodeReady,
638-
v1.ConditionTrue,
639-
"Ready",
640-
"Ready",
641-
).Obj(),
642-
wantEvents: []framework.ClusterEvent{queue.NodeConditionChange},
643-
},
644-
{
645-
name: "both node label and node taint changed",
646-
newNode: st.MakeNode().
647-
Label("foo", "bar").
648-
Taints([]v1.Taint{
649-
{Key: v1.TaintNodeUnschedulable, Value: "", Effect: v1.TaintEffectNoSchedule},
650-
}).Obj(),
651-
oldNode: st.MakeNode().Taints([]v1.Taint{
652-
{Key: v1.TaintNodeUnschedulable, Value: "foo", Effect: v1.TaintEffectNoSchedule},
653-
}).Obj(),
654-
wantEvents: []framework.ClusterEvent{queue.NodeLabelChange, queue.NodeTaintChange},
655-
},
656-
}
657-
658-
for _, tc := range testCases {
659-
gotEvents := nodeSchedulingPropertiesChange(tc.newNode, tc.oldNode)
660-
if diff := cmp.Diff(tc.wantEvents, gotEvents); diff != "" {
661-
t.Errorf("unexpected event (-want, +got):\n%s", diff)
662-
}
663-
}
664-
}

0 commit comments

Comments
 (0)