mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 19:56:01 +00:00
Merge pull request #93534 from everpeace/score-in-preemption-handle
scheduler: expose Run[Pre]ScorePlugins functions to PreemptionHandle(through PluginRunner)
This commit is contained in:
commit
c72b30b3b7
@ -572,6 +572,10 @@ type PodNominator interface {
|
|||||||
// This is used by preemption PostFilter plugins when evaluating the feasibility of
|
// This is used by preemption PostFilter plugins when evaluating the feasibility of
|
||||||
// scheduling the pod on nodes when certain running pods get evicted.
|
// scheduling the pod on nodes when certain running pods get evicted.
|
||||||
type PluginsRunner interface {
|
type PluginsRunner interface {
|
||||||
|
// RunPreScorePlugins runs the set of configured PreScore plugins for pod on the given nodes
|
||||||
|
RunPreScorePlugins(context.Context, *CycleState, *v1.Pod, []*v1.Node) *Status
|
||||||
|
// RunScorePlugins runs the set of configured Score plugins for pod on the given nodes
|
||||||
|
RunScorePlugins(context.Context, *CycleState, *v1.Pod, []*v1.Node) (PluginToNodeScores, *Status)
|
||||||
// RunFilterPlugins runs the set of configured filter plugins for pod on the given node.
|
// RunFilterPlugins runs the set of configured filter plugins for pod on the given node.
|
||||||
RunFilterPlugins(context.Context, *CycleState, *v1.Pod, *NodeInfo) PluginToStatus
|
RunFilterPlugins(context.Context, *CycleState, *v1.Pod, *NodeInfo) PluginToStatus
|
||||||
// RunPreFilterExtensionAddPod calls the AddPod interface for the set of configured PreFilter plugins.
|
// RunPreFilterExtensionAddPod calls the AddPod interface for the set of configured PreFilter plugins.
|
||||||
|
@ -407,10 +407,17 @@ func (pp *PostFilterPlugin) PostFilter(ctx context.Context, state *framework.Cyc
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, framework.NewStatus(framework.Error, err.Error())
|
return nil, framework.NewStatus(framework.Error, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
ph := pp.fh.PreemptHandle()
|
ph := pp.fh.PreemptHandle()
|
||||||
for _, nodeInfo := range nodeInfos {
|
for _, nodeInfo := range nodeInfos {
|
||||||
ph.RunFilterPlugins(ctx, state, pod, nodeInfo)
|
ph.RunFilterPlugins(ctx, state, pod, nodeInfo)
|
||||||
}
|
}
|
||||||
|
var nodes []*v1.Node
|
||||||
|
for _, nodeInfo := range nodeInfos {
|
||||||
|
nodes = append(nodes, nodeInfo.Node())
|
||||||
|
}
|
||||||
|
ph.RunScorePlugins(ctx, state, pod, nodes)
|
||||||
|
|
||||||
if pp.failPostFilter {
|
if pp.failPostFilter {
|
||||||
return nil, framework.NewStatus(framework.Error, fmt.Sprintf("injecting failure for pod %v", pod.Name))
|
return nil, framework.NewStatus(framework.Error, fmt.Sprintf("injecting failure for pod %v", pod.Name))
|
||||||
}
|
}
|
||||||
@ -578,30 +585,52 @@ func TestPostFilterPlugin(t *testing.T) {
|
|||||||
numNodes := 1
|
numNodes := 1
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
numNodes int
|
||||||
rejectFilter bool
|
rejectFilter bool
|
||||||
|
failScore bool
|
||||||
rejectPostFilter bool
|
rejectPostFilter bool
|
||||||
expectFilterNumCalled int
|
expectFilterNumCalled int
|
||||||
|
expectScoreNumCalled int32
|
||||||
expectPostFilterNumCalled int
|
expectPostFilterNumCalled int
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Filter passed",
|
name: "Filter passed and Score success",
|
||||||
|
numNodes: 3,
|
||||||
rejectFilter: false,
|
rejectFilter: false,
|
||||||
|
failScore: false,
|
||||||
rejectPostFilter: false,
|
rejectPostFilter: false,
|
||||||
expectFilterNumCalled: numNodes,
|
expectFilterNumCalled: 3,
|
||||||
|
expectScoreNumCalled: 3,
|
||||||
expectPostFilterNumCalled: 0,
|
expectPostFilterNumCalled: 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Filter failed and PostFilter passed",
|
name: "Filter failed and PostFilter passed",
|
||||||
|
numNodes: numNodes,
|
||||||
rejectFilter: true,
|
rejectFilter: true,
|
||||||
|
failScore: false,
|
||||||
rejectPostFilter: false,
|
rejectPostFilter: false,
|
||||||
expectFilterNumCalled: numNodes * 2,
|
expectFilterNumCalled: numNodes * 2,
|
||||||
|
expectScoreNumCalled: 1,
|
||||||
expectPostFilterNumCalled: 1,
|
expectPostFilterNumCalled: 1,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Filter failed and PostFilter failed",
|
name: "Filter failed and PostFilter failed",
|
||||||
|
numNodes: numNodes,
|
||||||
rejectFilter: true,
|
rejectFilter: true,
|
||||||
|
failScore: false,
|
||||||
rejectPostFilter: true,
|
rejectPostFilter: true,
|
||||||
expectFilterNumCalled: numNodes * 2,
|
expectFilterNumCalled: numNodes * 2,
|
||||||
|
expectScoreNumCalled: 1,
|
||||||
|
expectPostFilterNumCalled: 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Score failed and PostFilter failed",
|
||||||
|
numNodes: numNodes,
|
||||||
|
rejectFilter: true,
|
||||||
|
failScore: true,
|
||||||
|
rejectPostFilter: true,
|
||||||
|
expectFilterNumCalled: numNodes * 2,
|
||||||
|
expectScoreNumCalled: 1,
|
||||||
expectPostFilterNumCalled: 1,
|
expectPostFilterNumCalled: 1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -611,12 +640,15 @@ func TestPostFilterPlugin(t *testing.T) {
|
|||||||
// Create a plugin registry for testing. Register a combination of filter and postFilter plugin.
|
// Create a plugin registry for testing. Register a combination of filter and postFilter plugin.
|
||||||
var (
|
var (
|
||||||
filterPlugin = &FilterPlugin{}
|
filterPlugin = &FilterPlugin{}
|
||||||
|
scorePlugin = &ScorePlugin{}
|
||||||
postFilterPlugin = &PostFilterPlugin{}
|
postFilterPlugin = &PostFilterPlugin{}
|
||||||
)
|
)
|
||||||
filterPlugin.rejectFilter = tt.rejectFilter
|
filterPlugin.rejectFilter = tt.rejectFilter
|
||||||
|
scorePlugin.failScore = tt.failScore
|
||||||
postFilterPlugin.rejectPostFilter = tt.rejectPostFilter
|
postFilterPlugin.rejectPostFilter = tt.rejectPostFilter
|
||||||
registry := frameworkruntime.Registry{
|
registry := frameworkruntime.Registry{
|
||||||
filterPluginName: newPlugin(filterPlugin),
|
filterPluginName: newPlugin(filterPlugin),
|
||||||
|
scorePluginName: newPlugin(scorePlugin),
|
||||||
postfilterPluginName: newPostFilterPlugin(postFilterPlugin),
|
postfilterPluginName: newPostFilterPlugin(postFilterPlugin),
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -629,6 +661,16 @@ func TestPostFilterPlugin(t *testing.T) {
|
|||||||
{Name: filterPluginName},
|
{Name: filterPluginName},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
Score: &schedulerconfig.PluginSet{
|
||||||
|
Enabled: []schedulerconfig.Plugin{
|
||||||
|
{Name: scorePluginName},
|
||||||
|
},
|
||||||
|
// disable default in-tree Score plugins
|
||||||
|
// to make it easy to control configured ScorePlugins failure
|
||||||
|
Disabled: []schedulerconfig.Plugin{
|
||||||
|
{Name: "*"},
|
||||||
|
},
|
||||||
|
},
|
||||||
PostFilter: &schedulerconfig.PluginSet{
|
PostFilter: &schedulerconfig.PluginSet{
|
||||||
Enabled: []schedulerconfig.Plugin{
|
Enabled: []schedulerconfig.Plugin{
|
||||||
{Name: postfilterPluginName},
|
{Name: postfilterPluginName},
|
||||||
@ -646,7 +688,7 @@ func TestPostFilterPlugin(t *testing.T) {
|
|||||||
testCtx := initTestSchedulerForFrameworkTest(
|
testCtx := initTestSchedulerForFrameworkTest(
|
||||||
t,
|
t,
|
||||||
testutils.InitTestMaster(t, fmt.Sprintf("postfilter%v-", i), nil),
|
testutils.InitTestMaster(t, fmt.Sprintf("postfilter%v-", i), nil),
|
||||||
numNodes,
|
tt.numNodes,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
||||||
)
|
)
|
||||||
@ -662,9 +704,13 @@ func TestPostFilterPlugin(t *testing.T) {
|
|||||||
if err = wait.Poll(10*time.Millisecond, 10*time.Second, podUnschedulable(testCtx.ClientSet, pod.Namespace, pod.Name)); err != nil {
|
if err = wait.Poll(10*time.Millisecond, 10*time.Second, podUnschedulable(testCtx.ClientSet, pod.Namespace, pod.Name)); err != nil {
|
||||||
t.Errorf("Didn't expect the pod to be scheduled.")
|
t.Errorf("Didn't expect the pod to be scheduled.")
|
||||||
}
|
}
|
||||||
|
|
||||||
if filterPlugin.numFilterCalled < tt.expectFilterNumCalled {
|
if filterPlugin.numFilterCalled < tt.expectFilterNumCalled {
|
||||||
t.Errorf("Expected the filter plugin to be called at least %v times, but got %v.", tt.expectFilterNumCalled, filterPlugin.numFilterCalled)
|
t.Errorf("Expected the filter plugin to be called at least %v times, but got %v.", tt.expectFilterNumCalled, filterPlugin.numFilterCalled)
|
||||||
}
|
}
|
||||||
|
if numScoreCalled := atomic.LoadInt32(&scorePlugin.numScoreCalled); numScoreCalled < tt.expectScoreNumCalled {
|
||||||
|
t.Errorf("Expected the score plugin to be called at least %v times, but got %v.", tt.expectScoreNumCalled, numScoreCalled)
|
||||||
|
}
|
||||||
if postFilterPlugin.numPostFilterCalled < tt.expectPostFilterNumCalled {
|
if postFilterPlugin.numPostFilterCalled < tt.expectPostFilterNumCalled {
|
||||||
t.Errorf("Expected the postfilter plugin to be called at least %v times, but got %v.", tt.expectPostFilterNumCalled, postFilterPlugin.numPostFilterCalled)
|
t.Errorf("Expected the postfilter plugin to be called at least %v times, but got %v.", tt.expectPostFilterNumCalled, postFilterPlugin.numPostFilterCalled)
|
||||||
}
|
}
|
||||||
@ -675,6 +721,9 @@ func TestPostFilterPlugin(t *testing.T) {
|
|||||||
if filterPlugin.numFilterCalled != tt.expectFilterNumCalled {
|
if filterPlugin.numFilterCalled != tt.expectFilterNumCalled {
|
||||||
t.Errorf("Expected the filter plugin to be called %v times, but got %v.", tt.expectFilterNumCalled, filterPlugin.numFilterCalled)
|
t.Errorf("Expected the filter plugin to be called %v times, but got %v.", tt.expectFilterNumCalled, filterPlugin.numFilterCalled)
|
||||||
}
|
}
|
||||||
|
if numScoreCalled := atomic.LoadInt32(&scorePlugin.numScoreCalled); numScoreCalled != tt.expectScoreNumCalled {
|
||||||
|
t.Errorf("Expected the score plugin to be called %v times, but got %v.", tt.expectScoreNumCalled, numScoreCalled)
|
||||||
|
}
|
||||||
if postFilterPlugin.numPostFilterCalled != tt.expectPostFilterNumCalled {
|
if postFilterPlugin.numPostFilterCalled != tt.expectPostFilterNumCalled {
|
||||||
t.Errorf("Expected the postfilter plugin to be called %v times, but got %v.", tt.expectPostFilterNumCalled, postFilterPlugin.numPostFilterCalled)
|
t.Errorf("Expected the postfilter plugin to be called %v times, but got %v.", tt.expectPostFilterNumCalled, postFilterPlugin.numPostFilterCalled)
|
||||||
}
|
}
|
||||||
@ -748,7 +797,7 @@ func TestScorePlugin(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if scorePlugin.numScoreCalled == 0 {
|
if numScoreCalled := atomic.LoadInt32(&scorePlugin.numScoreCalled); numScoreCalled == 0 {
|
||||||
t.Errorf("Expected the score plugin to be called.")
|
t.Errorf("Expected the score plugin to be called.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user