@@ -33,13 +33,16 @@ import (
33
33
"k8s.io/apimachinery/pkg/types"
34
34
"k8s.io/apimachinery/pkg/util/intstr"
35
35
"k8s.io/apimachinery/pkg/util/wait"
36
+ utilfeature "k8s.io/apiserver/pkg/util/feature"
36
37
"k8s.io/client-go/informers"
37
38
"k8s.io/client-go/kubernetes"
38
39
clientset "k8s.io/client-go/kubernetes"
39
40
restclient "k8s.io/client-go/rest"
41
+ featuregatetesting "k8s.io/component-base/featuregate/testing"
40
42
"k8s.io/klog/v2"
41
43
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
42
44
"k8s.io/kubernetes/pkg/apis/scheduling"
45
+ "k8s.io/kubernetes/pkg/features"
43
46
"k8s.io/kubernetes/pkg/scheduler"
44
47
schedulerconfig "k8s.io/kubernetes/pkg/scheduler/apis/config"
45
48
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
@@ -434,6 +437,87 @@ func TestPreemption(t *testing.T) {
434
437
}
435
438
}
436
439
440
+ // TestNonPreemption tests NonPreempt option of PriorityClass of scheduler works as expected.
441
+ func TestNonPreemption (t * testing.T ) {
442
+ defer featuregatetesting .SetFeatureGateDuringTest (t , utilfeature .DefaultFeatureGate , features .NonPreemptingPriority , true )()
443
+
444
+ var preemptNever = v1 .PreemptNever
445
+ // Initialize scheduler.
446
+ testCtx := initTest (t , "non-preemption" )
447
+ defer testutils .CleanupTest (t , testCtx )
448
+ cs := testCtx .ClientSet
449
+ tests := []struct {
450
+ name string
451
+ PreemptionPolicy * v1.PreemptionPolicy
452
+ }{
453
+ {
454
+ name : "pod preemption will happen" ,
455
+ PreemptionPolicy : nil ,
456
+ },
457
+ {
458
+ name : "pod preemption will not happen" ,
459
+ PreemptionPolicy : & preemptNever ,
460
+ },
461
+ }
462
+ victim := initPausePod (& pausePodConfig {
463
+ Name : "victim-pod" ,
464
+ Namespace : testCtx .NS .Name ,
465
+ Priority : & lowPriority ,
466
+ Resources : & v1.ResourceRequirements {Requests : v1.ResourceList {
467
+ v1 .ResourceCPU : * resource .NewMilliQuantity (400 , resource .DecimalSI ),
468
+ v1 .ResourceMemory : * resource .NewQuantity (200 , resource .DecimalSI )},
469
+ },
470
+ })
471
+
472
+ preemptor := initPausePod (& pausePodConfig {
473
+ Name : "preemptor-pod" ,
474
+ Namespace : testCtx .NS .Name ,
475
+ Priority : & highPriority ,
476
+ Resources : & v1.ResourceRequirements {Requests : v1.ResourceList {
477
+ v1 .ResourceCPU : * resource .NewMilliQuantity (300 , resource .DecimalSI ),
478
+ v1 .ResourceMemory : * resource .NewQuantity (200 , resource .DecimalSI )},
479
+ },
480
+ })
481
+
482
+ // Create a node with some resources and a label.
483
+ nodeRes := & v1.ResourceList {
484
+ v1 .ResourcePods : * resource .NewQuantity (32 , resource .DecimalSI ),
485
+ v1 .ResourceCPU : * resource .NewMilliQuantity (500 , resource .DecimalSI ),
486
+ v1 .ResourceMemory : * resource .NewQuantity (500 , resource .DecimalSI ),
487
+ }
488
+ _ , err := createNode (testCtx .ClientSet , "node1" , nodeRes )
489
+ if err != nil {
490
+ t .Fatalf ("Error creating nodes: %v" , err )
491
+ }
492
+ for _ , test := range tests {
493
+ t .Run (test .name , func (t * testing.T ) {
494
+ defer testutils .CleanupPods (cs , t , []* v1.Pod {preemptor , victim })
495
+ preemptor .Spec .PreemptionPolicy = test .PreemptionPolicy
496
+ victimPod , err := createPausePod (cs , victim )
497
+ if err != nil {
498
+ t .Fatalf ("Error while creating victim: %v" , err )
499
+ }
500
+ if err := waitForPodToScheduleWithTimeout (cs , victimPod , 5 * time .Second ); err != nil {
501
+ t .Fatalf ("victim %v should be become scheduled" , victimPod .Name )
502
+ }
503
+
504
+ preemptorPod , err := createPausePod (cs , preemptor )
505
+ if err != nil {
506
+ t .Fatalf ("Error while creating preemptor: %v" , err )
507
+ }
508
+
509
+ err = waitForNominatedNodeNameWithTimeout (cs , preemptorPod , 5 * time .Second )
510
+ // test.PreemptionPolicy == nil means we expect the preemptor to be nominated.
511
+ expect := test .PreemptionPolicy == nil
512
+ // err == nil indicates the preemptor is indeed nominated.
513
+ got := err == nil
514
+ if got != expect {
515
+ t .Errorf ("Expect preemptor to be nominated=%v, but got=%v" , expect , got )
516
+ }
517
+ })
518
+ }
519
+ }
520
+
437
521
// TestDisablePreemption tests disable pod preemption of scheduler works as expected.
438
522
func TestDisablePreemption (t * testing.T ) {
439
523
// Initialize scheduler, and disable preemption.
0 commit comments