diff --git a/pkg/scheduler/core/BUILD b/pkg/scheduler/core/BUILD index 873c0150cf..fc0636ef99 100644 --- a/pkg/scheduler/core/BUILD +++ b/pkg/scheduler/core/BUILD @@ -29,6 +29,7 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", ], diff --git a/pkg/scheduler/core/generic_scheduler.go b/pkg/scheduler/core/generic_scheduler.go index 92bddc921a..21e093ca6a 100644 --- a/pkg/scheduler/core/generic_scheduler.go +++ b/pkg/scheduler/core/generic_scheduler.go @@ -667,6 +667,7 @@ func PrioritizeNodes( results[i] = make(schedulerapi.HostPriorityList, len(nodes)) } } + processNode := func(index int) { nodeInfo := nodeNameToInfo[nodes[index].Name] var err error @@ -677,7 +678,7 @@ func PrioritizeNodes( results[i][index], err = priorityConfigs[i].Map(pod, meta, nodeInfo) if err != nil { appendError(err) - return + results[i][index].Host = nodes[index].Name } } } diff --git a/pkg/scheduler/core/generic_scheduler_test.go b/pkg/scheduler/core/generic_scheduler_test.go index eed2460cfa..670f2611fc 100644 --- a/pkg/scheduler/core/generic_scheduler_test.go +++ b/pkg/scheduler/core/generic_scheduler_test.go @@ -31,6 +31,7 @@ import ( "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/kubernetes/pkg/scheduler/algorithm" @@ -44,7 +45,8 @@ import ( ) var ( - order = []string{"false", "true", "matches", "nopods", algorithmpredicates.MatchInterPodAffinityPred} + errPrioritize = fmt.Errorf("priority map encounters an error") + order = []string{"false", "true", "matches", "nopods", algorithmpredicates.MatchInterPodAffinityPred} ) func falsePredicate(pod *v1.Pod, meta algorithm.PredicateMetadata, nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason, error) { @@ -111,6 +113,26 @@ func reverseNumericPriority(pod *v1.Pod, nodeNameToInfo map[string]*schedulercac return reverseResult, nil } +func trueMapPriority(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error) { + return schedulerapi.HostPriority{ + Host: nodeInfo.Node().Name, + Score: 1, + }, nil +} + +func falseMapPriority(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error) { + return schedulerapi.HostPriority{}, errPrioritize +} + +func getNodeReducePriority(pod *v1.Pod, meta interface{}, nodeNameToInfo map[string]*schedulercache.NodeInfo, result schedulerapi.HostPriorityList) error { + for _, host := range result { + if host.Host == "" { + return fmt.Errorf("unexpected empty host name") + } + } + return nil +} + func makeNodeList(nodeNames []string) []*v1.Node { result := make([]*v1.Node, 0, len(nodeNames)) for _, nodeName := range nodeNames { @@ -399,6 +421,14 @@ func TestGenericScheduler(t *testing.T) { }, }, }, + { + predicates: map[string]algorithm.FitPredicate{"true": truePredicate}, + prioritizers: []algorithm.PriorityConfig{{Map: falseMapPriority, Weight: 1}, {Map: trueMapPriority, Reduce: getNodeReducePriority, Weight: 2}}, + nodes: []string{"2", "1"}, + pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2"}}, + name: "test error with priority map", + wErr: errors.NewAggregate([]error{errPrioritize, errPrioritize}), + }, } for _, test := range tests { t.Run(test.name, func(t *testing.T) {