diff --git a/pkg/scheduler/framework/plugins/nodelabel/node_label.go b/pkg/scheduler/framework/plugins/nodelabel/node_label.go index f9ee13bbfcc..ad5188fa33f 100644 --- a/pkg/scheduler/framework/plugins/nodelabel/node_label.go +++ b/pkg/scheduler/framework/plugins/nodelabel/node_label.go @@ -89,6 +89,12 @@ func (pl *NodeLabel) Filter(ctx context.Context, _ *framework.CycleState, pod *v if node == nil { return framework.NewStatus(framework.Error, "node not found") } + + size := int64(len(pl.args.PresentLabels) + len(pl.args.AbsentLabels)) + if size == 0 { + return nil + } + nodeLabels := labels.Set(node.Labels) check := func(labels []string, presence bool) bool { for _, label := range labels { @@ -114,6 +120,15 @@ func (pl *NodeLabel) Score(ctx context.Context, state *framework.CycleState, pod } node := nodeInfo.Node() + if node == nil { + return 0, framework.NewStatus(framework.Error, "node not found") + } + + size := int64(len(pl.args.PresentLabelsPreference) + len(pl.args.AbsentLabelsPreference)) + if size == 0 { + return 0, nil + } + score := int64(0) for _, label := range pl.args.PresentLabelsPreference { if labels.Set(node.Labels).Has(label) { @@ -125,8 +140,9 @@ func (pl *NodeLabel) Score(ctx context.Context, state *framework.CycleState, pod score += framework.MaxNodeScore } } + // Take average score for each label to ensure the score doesn't exceed MaxNodeScore. - score /= int64(len(pl.args.PresentLabelsPreference) + len(pl.args.AbsentLabelsPreference)) + score /= size return score, nil } diff --git a/pkg/scheduler/framework/plugins/nodelabel/node_label_test.go b/pkg/scheduler/framework/plugins/nodelabel/node_label_test.go index 5f332321b7e..efcdb3d1828 100644 --- a/pkg/scheduler/framework/plugins/nodelabel/node_label_test.go +++ b/pkg/scheduler/framework/plugins/nodelabel/node_label_test.go @@ -110,6 +110,11 @@ func TestNodeLabelFilter(t *testing.T) { }, res: framework.UnschedulableAndUnresolvable, }, + { + name: "no label", + args: config.NodeLabelArgs{}, + res: framework.Success, + }, } for _, test := range tests { @@ -231,6 +236,11 @@ func TestNodeLabelScore(t *testing.T) { }, name: "two present labels one matches, two absent labels mismatch", }, + { + want: 0, + args: config.NodeLabelArgs{}, + name: "no label preference", + }, } for _, test := range tests {