Merge pull request #120434 from pohly/scheduler-backoff-metric-test

scheduler: fix TestIncomingPodsMetrics unit test
This commit is contained in:
Kubernetes Prow Robot 2023-09-18 03:00:31 -07:00 committed by GitHub
commit 3cfdf3c33d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2255,7 +2255,7 @@ func TestPriorityQueue_initPodMaxInUnschedulablePodsDuration(t *testing.T) {
var podInfoList []*framework.QueuedPodInfo
for i, op := range test.operations {
op(logger, queue, test.operands[i])
op(t, logger, queue, test.operands[i])
}
expectedLen := len(test.expected)
@ -2278,31 +2278,58 @@ func TestPriorityQueue_initPodMaxInUnschedulablePodsDuration(t *testing.T) {
}
}
type operation func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo)
type operation func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo)
var (
add = func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
queue.Add(logger, pInfo.Pod)
}
addUnschedulablePodBackToUnschedulablePods = func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
// To simulate the pod is failed in scheduling in the real world, Pop() the pod from activeQ before AddUnschedulableIfNotPresent() below.
queue.activeQ.Add(queue.newQueuedPodInfo(pInfo.Pod))
if p, err := queue.Pop(); err != nil || p.Pod != pInfo.Pod {
panic(fmt.Sprintf("Expected: %v after Pop, but got: %v", pInfo.Pod.Name, p.Pod.Name))
add = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
if err := queue.Add(logger, pInfo.Pod); err != nil {
t.Fatalf("Unexpected error during Add: %v", err)
}
queue.AddUnschedulableIfNotPresent(logger, pInfo, 1)
}
addUnschedulablePodBackToBackoffQ = func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
queue.AddUnschedulableIfNotPresent(logger, pInfo, 1)
popAndRequeueAsUnschedulable = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
// To simulate the pod is failed in scheduling in the real world, Pop() the pod from activeQ before AddUnschedulableIfNotPresent() below.
// UnschedulablePlugins will get cleared by Pop, so make a copy first.
unschedulablePlugins := pInfo.UnschedulablePlugins.Clone()
if err := queue.activeQ.Add(queue.newQueuedPodInfo(pInfo.Pod)); err != nil {
t.Fatalf("Unexpected error during Add: %v", err)
}
p, err := queue.Pop()
if err != nil {
t.Fatalf("Unexpected error during Pop: %v", err)
}
if p.Pod != pInfo.Pod {
t.Fatalf("Expected: %v after Pop, but got: %v", pInfo.Pod.Name, p.Pod.Name)
}
// Simulate plugins that are waiting for some events.
p.UnschedulablePlugins = unschedulablePlugins
if err := queue.AddUnschedulableIfNotPresent(logger, p, 1); err != nil {
t.Fatalf("Unexpected error during AddUnschedulableIfNotPresent: %v", err)
}
}
addPodActiveQ = func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
popAndRequeueAsBackoff = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
// To simulate the pod is failed in scheduling in the real world, Pop() the pod from activeQ before AddUnschedulableIfNotPresent() below.
if err := queue.activeQ.Add(queue.newQueuedPodInfo(pInfo.Pod)); err != nil {
t.Fatalf("Unexpected error during Add: %v", err)
}
p, err := queue.Pop()
if err != nil {
t.Fatalf("Unexpected error during Pop: %v", err)
}
if p.Pod != pInfo.Pod {
t.Fatalf("Expected: %v after Pop, but got: %v", pInfo.Pod.Name, p.Pod.Name)
}
// When there is no known unschedulable plugin, pods always go to the backoff queue.
if err := queue.AddUnschedulableIfNotPresent(logger, p, 1); err != nil {
t.Fatalf("Unexpected error during AddUnschedulableIfNotPresent: %v", err)
}
}
addPodActiveQ = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
queue.activeQ.Add(pInfo)
}
updatePodActiveQ = func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
updatePodActiveQ = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
queue.activeQ.Update(pInfo)
}
addPodUnschedulablePods = func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
addPodUnschedulablePods = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
if !pInfo.Gated {
// Update pod condition to unschedulable.
podutil.UpdatePodCondition(&pInfo.Pod.Status, &v1.PodCondition{
@ -2314,28 +2341,28 @@ var (
}
queue.unschedulablePods.addOrUpdate(pInfo)
}
deletePod = func(_ klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
deletePod = func(t *testing.T, _ klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
queue.Delete(pInfo.Pod)
}
updatePodQueueable = func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
updatePodQueueable = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
newPod := pInfo.Pod.DeepCopy()
newPod.Labels = map[string]string{"queueable": ""}
queue.Update(logger, pInfo.Pod, newPod)
}
addPodBackoffQ = func(logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
addPodBackoffQ = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, pInfo *framework.QueuedPodInfo) {
queue.podBackoffQ.Add(pInfo)
}
moveAllToActiveOrBackoffQ = func(logger klog.Logger, queue *PriorityQueue, _ *framework.QueuedPodInfo) {
moveAllToActiveOrBackoffQ = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, _ *framework.QueuedPodInfo) {
queue.MoveAllToActiveOrBackoffQueue(logger, UnschedulableTimeout, nil, nil, nil)
}
flushBackoffQ = func(logger klog.Logger, queue *PriorityQueue, _ *framework.QueuedPodInfo) {
flushBackoffQ = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, _ *framework.QueuedPodInfo) {
queue.clock.(*testingclock.FakeClock).Step(2 * time.Second)
queue.flushBackoffQCompleted(logger)
}
moveClockForward = func(logger klog.Logger, queue *PriorityQueue, _ *framework.QueuedPodInfo) {
moveClockForward = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, _ *framework.QueuedPodInfo) {
queue.clock.(*testingclock.FakeClock).Step(2 * time.Second)
}
flushUnschedulerQ = func(logger klog.Logger, queue *PriorityQueue, _ *framework.QueuedPodInfo) {
flushUnschedulerQ = func(t *testing.T, logger klog.Logger, queue *PriorityQueue, _ *framework.QueuedPodInfo) {
queue.clock.(*testingclock.FakeClock).Step(queue.podMaxInUnschedulablePodsDuration)
queue.flushUnschedulablePodsLeftover(logger)
}
@ -2413,7 +2440,7 @@ func TestPodTimestamp(t *testing.T) {
var podInfoList []*framework.QueuedPodInfo
for i, op := range test.operations {
op(logger, queue, test.operands[i])
op(t, logger, queue, test.operands[i])
}
expectedLen := len(test.expected)
@ -2698,7 +2725,7 @@ scheduler_plugin_execution_duration_seconds_count{extension_point="PreEnqueue",p
queue := NewTestQueue(ctx, newDefaultQueueSort(), WithClock(testingclock.NewFakeClock(timestamp)), WithPreEnqueuePluginMap(m), WithPluginMetricsSamplePercent(test.pluginMetricsSamplePercent), WithMetricsRecorder(*recorder))
for i, op := range test.operations {
for _, pInfo := range test.operands[i] {
op(logger, queue, pInfo)
op(t, logger, queue, pInfo)
}
}
@ -2856,7 +2883,7 @@ func TestIncomingPodsMetrics(t *testing.T) {
{
name: "add pods to unschedulablePods",
operations: []operation{
addUnschedulablePodBackToUnschedulablePods,
popAndRequeueAsUnschedulable,
},
want: `
scheduler_queue_incoming_pods_total{event="ScheduleAttemptFailure",queue="unschedulable"} 3
@ -2865,7 +2892,7 @@ func TestIncomingPodsMetrics(t *testing.T) {
{
name: "add pods to unschedulablePods and then move all to backoffQ",
operations: []operation{
addUnschedulablePodBackToUnschedulablePods,
popAndRequeueAsUnschedulable,
moveAllToActiveOrBackoffQ,
},
want: ` scheduler_queue_incoming_pods_total{event="ScheduleAttemptFailure",queue="unschedulable"} 3
@ -2875,7 +2902,7 @@ func TestIncomingPodsMetrics(t *testing.T) {
{
name: "add pods to unschedulablePods and then move all to activeQ",
operations: []operation{
addUnschedulablePodBackToUnschedulablePods,
popAndRequeueAsUnschedulable,
moveClockForward,
moveAllToActiveOrBackoffQ,
},
@ -2886,7 +2913,7 @@ func TestIncomingPodsMetrics(t *testing.T) {
{
name: "make some pods subject to backoff and add them to backoffQ, then flush backoffQ",
operations: []operation{
addUnschedulablePodBackToBackoffQ,
popAndRequeueAsBackoff,
moveClockForward,
flushBackoffQ,
},
@ -2905,7 +2932,7 @@ func TestIncomingPodsMetrics(t *testing.T) {
queue := NewTestQueue(ctx, newDefaultQueueSort(), WithClock(testingclock.NewFakeClock(timestamp)))
for _, op := range test.operations {
for _, pInfo := range pInfos {
op(logger, queue, pInfo)
op(t, logger, queue, pInfo)
}
}
metricName := metrics.SchedulerSubsystem + "_" + metrics.SchedulerQueueIncomingPods.Name