volcano.sh/volcano@v1.9.0/pkg/scheduler/actions/backfill/backfill_test.go (about) 1 package backfill 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 v1 "k8s.io/api/core/v1" 8 schedulingapi "k8s.io/api/scheduling/v1" 9 "k8s.io/apimachinery/pkg/api/resource" 10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 11 "k8s.io/client-go/tools/record" 12 schedulingv1beta1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1" 13 14 "volcano.sh/volcano/pkg/scheduler/api" 15 "volcano.sh/volcano/pkg/scheduler/cache" 16 "volcano.sh/volcano/pkg/scheduler/conf" 17 "volcano.sh/volcano/pkg/scheduler/framework" 18 "volcano.sh/volcano/pkg/scheduler/plugins/drf" 19 "volcano.sh/volcano/pkg/scheduler/plugins/priority" 20 "volcano.sh/volcano/pkg/scheduler/util" 21 ) 22 23 func TestPickUpPendingTasks(t *testing.T) { 24 framework.RegisterPluginBuilder("priority", priority.New) 25 framework.RegisterPluginBuilder("drf", drf.New) 26 trueValue := true 27 tilers := []conf.Tier{ 28 { 29 Plugins: []conf.PluginOption{ 30 { 31 Name: "priority", 32 EnabledPreemptable: &trueValue, 33 EnabledTaskOrder: &trueValue, 34 EnabledJobOrder: &trueValue, 35 }, 36 { 37 Name: "drf", 38 EnabledQueueOrder: &trueValue, 39 }, 40 }, 41 }, 42 } 43 44 priority4, priority3, priority2, priority1 := int32(4), int32(3), int32(2), int32(1) 45 46 testCases := []struct { 47 name string 48 pipelinedPods []*v1.Pod 49 pendingPods []*v1.Pod 50 queues []*schedulingv1beta1.Queue 51 podGroups []*schedulingv1beta1.PodGroup 52 PriorityClasses map[string]*schedulingapi.PriorityClass 53 expectedResult []string 54 }{ 55 { 56 name: "test", 57 pendingPods: []*v1.Pod{ 58 util.BuildPodWithPriority("default", "pg1-besteffort-task-1", "", v1.PodPending, nil, "pg1", make(map[string]string), make(map[string]string), &priority1), 59 util.BuildPodWithPriority("default", "pg1-unbesteffort-task-1", "", v1.PodPending, v1.ResourceList{"cpu": resource.MustParse("500m")}, "pg1", make(map[string]string), make(map[string]string), &priority1), 60 util.BuildPodWithPriority("default", "pg1-besteffort-task-3", "", v1.PodPending, nil, "pg1", make(map[string]string), make(map[string]string), &priority3), 61 util.BuildPodWithPriority("default", "pg1-unbesteffort-task-3", "", v1.PodPending, v1.ResourceList{"cpu": resource.MustParse("500m")}, "pg1", make(map[string]string), make(map[string]string), &priority3), 62 63 util.BuildPodWithPriority("default", "pg2-besteffort-task-1", "", v1.PodPending, nil, "pg2", make(map[string]string), make(map[string]string), &priority1), 64 util.BuildPodWithPriority("default", "pg2-unbesteffort-task-1", "", v1.PodPending, v1.ResourceList{"cpu": resource.MustParse("500m")}, "pg2", make(map[string]string), make(map[string]string), &priority1), 65 util.BuildPodWithPriority("default", "pg2-besteffort-task-3", "", v1.PodPending, nil, "pg2", make(map[string]string), make(map[string]string), &priority3), 66 util.BuildPodWithPriority("default", "pg2-unbesteffort-task-3", "", v1.PodPending, v1.ResourceList{"cpu": resource.MustParse("500m")}, "pg2", make(map[string]string), make(map[string]string), &priority3), 67 }, 68 pipelinedPods: []*v1.Pod{ 69 util.BuildPodWithPriority("default", "pg1-besteffort-task-2", "", v1.PodPending, nil, "pg1", make(map[string]string), make(map[string]string), &priority2), 70 util.BuildPodWithPriority("default", "pg1-unbesteffort-task-2", "", v1.PodPending, v1.ResourceList{"cpu": resource.MustParse("500m")}, "pg1", make(map[string]string), make(map[string]string), &priority2), 71 util.BuildPodWithPriority("default", "pg1-besteffort-task-4", "", v1.PodPending, nil, "pg1", make(map[string]string), make(map[string]string), &priority4), 72 util.BuildPodWithPriority("default", "pg1-unbesteffort-task-4", "", v1.PodPending, v1.ResourceList{"cpu": resource.MustParse("500m")}, "pg1", make(map[string]string), make(map[string]string), &priority4), 73 74 util.BuildPodWithPriority("default", "pg2-besteffort-task-2", "", v1.PodPending, nil, "pg2", make(map[string]string), make(map[string]string), &priority2), 75 util.BuildPodWithPriority("default", "pg2-unbesteffort-task-2", "", v1.PodPending, v1.ResourceList{"cpu": resource.MustParse("500m")}, "pg2", make(map[string]string), make(map[string]string), &priority2), 76 util.BuildPodWithPriority("default", "pg2-besteffort-task-4", "", v1.PodPending, nil, "pg2", make(map[string]string), make(map[string]string), &priority4), 77 util.BuildPodWithPriority("default", "pg2-unbesteffort-task-4", "", v1.PodPending, v1.ResourceList{"cpu": resource.MustParse("500m")}, "pg2", make(map[string]string), make(map[string]string), &priority4), 78 }, 79 queues: []*schedulingv1beta1.Queue{ 80 util.BuildQueue("q1", 1, nil), 81 }, 82 podGroups: []*schedulingv1beta1.PodGroup{ 83 util.BuildPodGroupWithPrio("pg1", "default", "q1", 1, map[string]int32{"": 3}, schedulingv1beta1.PodGroupInqueue, "job-priority-1"), 84 util.BuildPodGroupWithPrio("pg2", "default", "q1", 1, map[string]int32{"": 3}, schedulingv1beta1.PodGroupInqueue, "job-priority-2"), 85 }, 86 PriorityClasses: map[string]*schedulingapi.PriorityClass{ 87 "job-priority-1": { 88 ObjectMeta: metav1.ObjectMeta{ 89 Name: "job-priority-1", 90 }, 91 Value: 1, 92 }, 93 "job-priority-2": { 94 ObjectMeta: metav1.ObjectMeta{ 95 Name: "job-priority-2", 96 }, 97 Value: 2, 98 }, 99 }, 100 101 expectedResult: []string{ 102 "pg2-besteffort-task-4", 103 "pg2-besteffort-task-3", 104 "pg2-besteffort-task-2", 105 "pg2-besteffort-task-1", 106 "pg1-besteffort-task-4", 107 "pg1-besteffort-task-3", 108 "pg1-besteffort-task-2", 109 "pg1-besteffort-task-1", 110 }, 111 }, 112 } 113 114 for _, tc := range testCases { 115 schedulerCache := &cache.SchedulerCache{ 116 Nodes: make(map[string]*api.NodeInfo), 117 Jobs: make(map[api.JobID]*api.JobInfo), 118 Queues: make(map[api.QueueID]*api.QueueInfo), 119 Binder: nil, 120 StatusUpdater: &util.FakeStatusUpdater{}, 121 VolumeBinder: &util.FakeVolumeBinder{}, 122 Recorder: record.NewFakeRecorder(100), 123 PriorityClasses: tc.PriorityClasses, 124 } 125 126 for _, q := range tc.queues { 127 schedulerCache.AddQueueV1beta1(q) 128 } 129 130 for _, ss := range tc.podGroups { 131 schedulerCache.AddPodGroupV1beta1(ss) 132 } 133 134 for _, pod := range tc.pendingPods { 135 schedulerCache.AddPod(pod) 136 } 137 138 for _, pod := range tc.pipelinedPods { 139 schedulerCache.AddPod(pod) 140 } 141 142 ssn := framework.OpenSession(schedulerCache, tilers, []conf.Configuration{}) 143 for _, pod := range tc.pipelinedPods { 144 jobID := api.NewTaskInfo(pod).Job 145 stmt := framework.NewStatement(ssn) 146 task, found := ssn.Jobs[jobID].Tasks[api.PodKey(pod)] 147 if found { 148 stmt.Pipeline(task, "node1") 149 } 150 } 151 152 tasks := New().pickUpPendingTasks(ssn) 153 var actualResult []string 154 for _, task := range tasks { 155 actualResult = append(actualResult, task.Name) 156 } 157 158 if !assert.Equal(t, tc.expectedResult, actualResult) { 159 t.Errorf("unexpected test; name: %s, expected result: %v, actual result: %v", tc.name, tc.expectedResult, actualResult) 160 } 161 } 162 }