func TestGenericSchedulerWithExtenders(t *testing.T) { tests := []struct { name string predicates map[string]algorithm.FitPredicate prioritizers []algorithm.PriorityConfig extenders []FakeExtender extenderPredicates []fitPredicate extenderPrioritizers []priorityConfig nodes []string pod *api.Pod pods []*api.Pod expectedHost string expectsErr bool }{ { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{EqualPriority, 1}}, extenders: []FakeExtender{ { predicates: []fitPredicate{truePredicateExtender}, }, { predicates: []fitPredicate{errorPredicateExtender}, }, }, nodes: []string{"machine1", "machine2"}, expectsErr: true, name: "test 1", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{EqualPriority, 1}}, extenders: []FakeExtender{ { predicates: []fitPredicate{truePredicateExtender}, }, { predicates: []fitPredicate{falsePredicateExtender}, }, }, nodes: []string{"machine1", "machine2"}, expectsErr: true, name: "test 2", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{EqualPriority, 1}}, extenders: []FakeExtender{ { predicates: []fitPredicate{truePredicateExtender}, }, { predicates: []fitPredicate{machine1PredicateExtender}, }, }, nodes: []string{"machine1", "machine2"}, expectedHost: "machine1", name: "test 3", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{EqualPriority, 1}}, extenders: []FakeExtender{ { predicates: []fitPredicate{machine2PredicateExtender}, }, { predicates: []fitPredicate{machine1PredicateExtender}, }, }, nodes: []string{"machine1", "machine2"}, expectsErr: true, name: "test 4", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{EqualPriority, 1}}, extenders: []FakeExtender{ { predicates: []fitPredicate{truePredicateExtender}, prioritizers: []priorityConfig{{errorPrioritizerExtender, 10}}, weight: 1, }, }, nodes: []string{"machine1"}, expectedHost: "machine1", name: "test 5", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{EqualPriority, 1}}, extenders: []FakeExtender{ { predicates: []fitPredicate{truePredicateExtender}, prioritizers: []priorityConfig{{machine1PrioritizerExtender, 10}}, weight: 1, }, { predicates: []fitPredicate{truePredicateExtender}, prioritizers: []priorityConfig{{machine2PrioritizerExtender, 10}}, weight: 5, }, }, nodes: []string{"machine1", "machine2"}, expectedHost: "machine2", name: "test 6", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{machine2Prioritizer, 20}}, extenders: []FakeExtender{ { predicates: []fitPredicate{truePredicateExtender}, prioritizers: []priorityConfig{{machine1PrioritizerExtender, 10}}, weight: 1, }, }, nodes: []string{"machine1", "machine2"}, expectedHost: "machine2", // machine2 has higher score name: "test 7", }, } for _, test := range tests { random := rand.New(rand.NewSource(0)) extenders := []algorithm.SchedulerExtender{} for ii := range test.extenders { extenders = append(extenders, &test.extenders[ii]) } scheduler := NewGenericScheduler(schedulertesting.PodsToCache(test.pods), test.predicates, test.prioritizers, extenders, random) machine, err := scheduler.Schedule(test.pod, algorithm.FakeNodeLister(makeNodeList(test.nodes))) if test.expectsErr { if err == nil { t.Errorf("Unexpected non-error for %s, machine %s", test.name, machine) } } else { if err != nil { t.Errorf("Unexpected error: %v", err) } if test.expectedHost != machine { t.Errorf("Failed : %s, Expected: %s, Saw: %s", test.name, test.expectedHost, machine) } } } }
func TestGenericScheduler(t *testing.T) { tests := []struct { name string predicates map[string]algorithm.FitPredicate prioritizers []algorithm.PriorityConfig nodes []string pod *api.Pod pods []*api.Pod expectedHosts sets.String expectsErr bool }{ { predicates: map[string]algorithm.FitPredicate{"false": falsePredicate}, prioritizers: []algorithm.PriorityConfig{{Function: EqualPriority, Weight: 1}}, nodes: []string{"machine1", "machine2"}, expectsErr: true, name: "test 1", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{Function: EqualPriority, Weight: 1}}, nodes: []string{"machine1", "machine2"}, expectedHosts: sets.NewString("machine1", "machine2"), name: "test 2", }, { // Fits on a machine where the pod ID matches the machine name predicates: map[string]algorithm.FitPredicate{"matches": matchesPredicate}, prioritizers: []algorithm.PriorityConfig{{Function: EqualPriority, Weight: 1}}, nodes: []string{"machine1", "machine2"}, pod: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "machine2"}}, expectedHosts: sets.NewString("machine2"), name: "test 3", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{Function: numericPriority, Weight: 1}}, nodes: []string{"3", "2", "1"}, expectedHosts: sets.NewString("3"), name: "test 4", }, { predicates: map[string]algorithm.FitPredicate{"matches": matchesPredicate}, prioritizers: []algorithm.PriorityConfig{{Function: numericPriority, Weight: 1}}, nodes: []string{"3", "2", "1"}, pod: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "2"}}, expectedHosts: sets.NewString("2"), name: "test 5", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, prioritizers: []algorithm.PriorityConfig{{Function: numericPriority, Weight: 1}, {Function: reverseNumericPriority, Weight: 2}}, nodes: []string{"3", "2", "1"}, pod: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "2"}}, expectedHosts: sets.NewString("1"), name: "test 6", }, { predicates: map[string]algorithm.FitPredicate{"true": truePredicate, "false": falsePredicate}, prioritizers: []algorithm.PriorityConfig{{Function: numericPriority, Weight: 1}}, nodes: []string{"3", "2", "1"}, expectsErr: true, name: "test 7", }, { predicates: map[string]algorithm.FitPredicate{ "nopods": hasNoPodsPredicate, "matches": matchesPredicate, }, pods: []*api.Pod{ { ObjectMeta: api.ObjectMeta{Name: "2"}, Spec: api.PodSpec{ NodeName: "2", }, Status: api.PodStatus{ Phase: api.PodRunning, }, }, }, pod: &api.Pod{ObjectMeta: api.ObjectMeta{Name: "2"}}, prioritizers: []algorithm.PriorityConfig{{Function: numericPriority, Weight: 1}}, nodes: []string{"1", "2"}, expectsErr: true, name: "test 8", }, } for _, test := range tests { random := rand.New(rand.NewSource(0)) scheduler := NewGenericScheduler(schedulertesting.PodsToCache(test.pods), test.predicates, test.prioritizers, []algorithm.SchedulerExtender{}, random) machine, err := scheduler.Schedule(test.pod, algorithm.FakeNodeLister(makeNodeList(test.nodes))) if test.expectsErr { if err == nil { t.Error("Unexpected non-error") } } else { if err != nil { t.Errorf("Unexpected error: %v", err) } if !test.expectedHosts.Has(machine) { t.Errorf("Failed : %s, Expected: %s, Saw: %s", test.name, test.expectedHosts, machine) } } } }