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  }