mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-05 10:19:50 +00:00
Merge pull request #129750 from googs1025/scheduler/add_integration_for_queuesortplugin
feature: add scheduler queuesort plugins integration test
This commit is contained in:
commit
c7489b20f2
@ -98,7 +98,7 @@ func TestUpdateNodeEvent(t *testing.T) {
|
|||||||
}},
|
}},
|
||||||
})
|
})
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 0,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 0, true,
|
||||||
scheduler.WithProfiles(cfg.Profiles...),
|
scheduler.WithProfiles(cfg.Profiles...),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
||||||
)
|
)
|
||||||
|
@ -26,6 +26,8 @@ import (
|
|||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/go-cmp/cmp"
|
||||||
|
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
@ -38,6 +40,7 @@ import (
|
|||||||
clientset "k8s.io/client-go/kubernetes"
|
clientset "k8s.io/client-go/kubernetes"
|
||||||
listersv1 "k8s.io/client-go/listers/core/v1"
|
listersv1 "k8s.io/client-go/listers/core/v1"
|
||||||
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
featuregatetesting "k8s.io/component-base/featuregate/testing"
|
||||||
|
corev1helpers "k8s.io/component-helpers/scheduling/corev1"
|
||||||
configv1 "k8s.io/kube-scheduler/config/v1"
|
configv1 "k8s.io/kube-scheduler/config/v1"
|
||||||
"k8s.io/kubernetes/pkg/features"
|
"k8s.io/kubernetes/pkg/features"
|
||||||
"k8s.io/kubernetes/pkg/scheduler"
|
"k8s.io/kubernetes/pkg/scheduler"
|
||||||
@ -75,6 +78,11 @@ func newPlugin(plugin framework.Plugin) frameworkruntime.PluginFactory {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type QueueSortPlugin struct {
|
||||||
|
// lessFunc is used to compare two queued pod infos.
|
||||||
|
lessFunc func(info1, info2 *framework.QueuedPodInfo) bool
|
||||||
|
}
|
||||||
|
|
||||||
type PreEnqueuePlugin struct {
|
type PreEnqueuePlugin struct {
|
||||||
called int
|
called int
|
||||||
admit bool
|
admit bool
|
||||||
@ -282,6 +290,7 @@ func (pp *PermitPlugin) deepCopy() *PermitPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
queuesortPluginName = "queuesort-plugin"
|
||||||
enqueuePluginName = "enqueue-plugin"
|
enqueuePluginName = "enqueue-plugin"
|
||||||
prefilterPluginName = "prefilter-plugin"
|
prefilterPluginName = "prefilter-plugin"
|
||||||
postfilterPluginName = "postfilter-plugin"
|
postfilterPluginName = "postfilter-plugin"
|
||||||
@ -308,6 +317,25 @@ var _ framework.PreBindPlugin = &PreBindPlugin{}
|
|||||||
var _ framework.BindPlugin = &BindPlugin{}
|
var _ framework.BindPlugin = &BindPlugin{}
|
||||||
var _ framework.PostBindPlugin = &PostBindPlugin{}
|
var _ framework.PostBindPlugin = &PostBindPlugin{}
|
||||||
var _ framework.PermitPlugin = &PermitPlugin{}
|
var _ framework.PermitPlugin = &PermitPlugin{}
|
||||||
|
var _ framework.QueueSortPlugin = &QueueSortPlugin{}
|
||||||
|
|
||||||
|
func (ep *QueueSortPlugin) Name() string {
|
||||||
|
return queuesortPluginName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ep *QueueSortPlugin) Less(info1, info2 *framework.QueuedPodInfo) bool {
|
||||||
|
if ep.lessFunc != nil {
|
||||||
|
return ep.lessFunc(info1, info2)
|
||||||
|
}
|
||||||
|
// If no custom less function is provided, default to return true.
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewQueueSortPlugin(lessFunc func(info1, info2 *framework.QueuedPodInfo) bool) *QueueSortPlugin {
|
||||||
|
return &QueueSortPlugin{
|
||||||
|
lessFunc: lessFunc,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (ep *PreEnqueuePlugin) Name() string {
|
func (ep *PreEnqueuePlugin) Name() string {
|
||||||
return enqueuePluginName
|
return enqueuePluginName
|
||||||
@ -668,7 +696,7 @@ func TestPreFilterPlugin(t *testing.T) {
|
|||||||
preFilterPlugin := &PreFilterPlugin{}
|
preFilterPlugin := &PreFilterPlugin{}
|
||||||
registry, prof := initRegistryAndConfig(t, preFilterPlugin)
|
registry, prof := initRegistryAndConfig(t, preFilterPlugin)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -705,6 +733,85 @@ func TestPreFilterPlugin(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestQueueSortPlugin tests invocation of queueSort plugins.
|
||||||
|
func TestQueueSortPlugin(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
podNames []string
|
||||||
|
expectedOrder []string
|
||||||
|
customLessFunc func(info1, info2 *framework.QueuedPodInfo) bool
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "timestamp_sort_order",
|
||||||
|
podNames: []string{"pod-1", "pod-2", "pod-3"},
|
||||||
|
expectedOrder: []string{"pod-1", "pod-2", "pod-3"},
|
||||||
|
customLessFunc: func(info1, info2 *framework.QueuedPodInfo) bool {
|
||||||
|
return info1.Timestamp.Before(info2.Timestamp)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "priority_sort_order",
|
||||||
|
podNames: []string{"pod-1", "pod-2", "pod-3"},
|
||||||
|
expectedOrder: []string{"pod-3", "pod-2", "pod-1"}, // depends on pod priority
|
||||||
|
customLessFunc: func(info1, info2 *framework.QueuedPodInfo) bool {
|
||||||
|
p1 := corev1helpers.PodPriority(info1.Pod)
|
||||||
|
p2 := corev1helpers.PodPriority(info2.Pod)
|
||||||
|
return (p1 > p2) || (p1 == p2 && info1.Timestamp.Before(info2.Timestamp))
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
queueSortPlugin := NewQueueSortPlugin(tt.customLessFunc)
|
||||||
|
registry, prof := initRegistryAndConfig(t, queueSortPlugin)
|
||||||
|
|
||||||
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "queuesort-plugin", nil), 2, false,
|
||||||
|
scheduler.WithProfiles(prof),
|
||||||
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
|
defer teardown()
|
||||||
|
|
||||||
|
pods := make([]*v1.Pod, 0, len(tt.podNames))
|
||||||
|
for i, name := range tt.podNames {
|
||||||
|
// Create a pod with different priority.
|
||||||
|
priority := int32(i + 1)
|
||||||
|
pod, err := testutils.CreatePausePod(testCtx.ClientSet,
|
||||||
|
testutils.InitPausePod(&testutils.PausePodConfig{Name: name, Namespace: testCtx.NS.Name, Priority: &priority}))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Error while creating %v: %v", name, err)
|
||||||
|
}
|
||||||
|
pods = append(pods, pod)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for all Pods to be in the scheduling queue.
|
||||||
|
err := wait.PollUntilContextTimeout(testCtx.Ctx, time.Millisecond*200, wait.ForeverTestTimeout, false, func(ctx context.Context) (bool, error) {
|
||||||
|
pendingPods, _ := testCtx.Scheduler.SchedulingQueue.PendingPods()
|
||||||
|
if len(pendingPods) == len(pods) {
|
||||||
|
t.Logf("All Pods are in the pending queue.")
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
t.Logf("Waiting for all Pods to be in the scheduling queue. %d/%d", len(pendingPods), len(pods))
|
||||||
|
return false, nil
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to observe all Pods in the scheduling queue: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
actualOrder := make([]string, len(tt.expectedOrder))
|
||||||
|
for i := 0; i < len(tt.expectedOrder); i++ {
|
||||||
|
queueInfo := testutils.NextPodOrDie(t, testCtx)
|
||||||
|
actualOrder[i] = queueInfo.Pod.Name
|
||||||
|
t.Logf("Popped Pod %q", queueInfo.Pod.Name)
|
||||||
|
}
|
||||||
|
if diff := cmp.Diff(tt.expectedOrder, actualOrder); diff != "" {
|
||||||
|
t.Errorf("Expected Pod order (-want,+got):\n%s", diff)
|
||||||
|
} else {
|
||||||
|
t.Logf("Pods were popped out in the expected order based on custom sorting logic.")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// TestPostFilterPlugin tests invocation of postFilter plugins.
|
// TestPostFilterPlugin tests invocation of postFilter plugins.
|
||||||
func TestPostFilterPlugin(t *testing.T) {
|
func TestPostFilterPlugin(t *testing.T) {
|
||||||
numNodes := 1
|
numNodes := 1
|
||||||
@ -848,7 +955,7 @@ func TestPostFilterPlugin(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}}})
|
}}})
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, int(tt.numNodes),
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, int(tt.numNodes), true,
|
||||||
scheduler.WithProfiles(cfg.Profiles...),
|
scheduler.WithProfiles(cfg.Profiles...),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
||||||
)
|
)
|
||||||
@ -916,7 +1023,7 @@ func TestScorePlugin(t *testing.T) {
|
|||||||
scorePlugin := &ScorePlugin{}
|
scorePlugin := &ScorePlugin{}
|
||||||
registry, prof := initRegistryAndConfig(t, scorePlugin)
|
registry, prof := initRegistryAndConfig(t, scorePlugin)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 10,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 10, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -960,7 +1067,7 @@ func TestNormalizeScorePlugin(t *testing.T) {
|
|||||||
scoreWithNormalizePlugin := &ScoreWithNormalizePlugin{}
|
scoreWithNormalizePlugin := &ScoreWithNormalizePlugin{}
|
||||||
registry, prof := initRegistryAndConfig(t, scoreWithNormalizePlugin)
|
registry, prof := initRegistryAndConfig(t, scoreWithNormalizePlugin)
|
||||||
|
|
||||||
testCtx, _ := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "score-plugin", nil), 10,
|
testCtx, _ := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "score-plugin", nil), 10, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
|
|
||||||
@ -1008,7 +1115,7 @@ func TestReservePluginReserve(t *testing.T) {
|
|||||||
reservePlugin := &ReservePlugin{}
|
reservePlugin := &ReservePlugin{}
|
||||||
registry, prof := initRegistryAndConfig(t, reservePlugin)
|
registry, prof := initRegistryAndConfig(t, reservePlugin)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -1123,7 +1230,7 @@ func TestPrebindPlugin(t *testing.T) {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, nodesNum,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, nodesNum, true,
|
||||||
scheduler.WithProfiles(cfg.Profiles...),
|
scheduler.WithProfiles(cfg.Profiles...),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -1279,7 +1386,7 @@ func TestUnReserveReservePlugins(t *testing.T) {
|
|||||||
}
|
}
|
||||||
registry, prof := initRegistryAndConfig(t, pls...)
|
registry, prof := initRegistryAndConfig(t, pls...)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -1373,7 +1480,7 @@ func TestUnReservePermitPlugins(t *testing.T) {
|
|||||||
}
|
}
|
||||||
registry, profile := initRegistryAndConfig(t, []framework.Plugin{test.plugin, reservePlugin}...)
|
registry, profile := initRegistryAndConfig(t, []framework.Plugin{test.plugin, reservePlugin}...)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(profile),
|
scheduler.WithProfiles(profile),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -1445,7 +1552,7 @@ func TestUnReservePreBindPlugins(t *testing.T) {
|
|||||||
}
|
}
|
||||||
registry, profile := initRegistryAndConfig(t, []framework.Plugin{test.plugin, reservePlugin}...)
|
registry, profile := initRegistryAndConfig(t, []framework.Plugin{test.plugin, reservePlugin}...)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(profile),
|
scheduler.WithProfiles(profile),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -1516,7 +1623,7 @@ func TestUnReserveBindPlugins(t *testing.T) {
|
|||||||
|
|
||||||
test.plugin.client = testContext.ClientSet
|
test.plugin.client = testContext.ClientSet
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(profile),
|
scheduler.WithProfiles(profile),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -1663,7 +1770,7 @@ func TestBindPlugin(t *testing.T) {
|
|||||||
}},
|
}},
|
||||||
})
|
})
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(cfg.Profiles...),
|
scheduler.WithProfiles(cfg.Profiles...),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
||||||
)
|
)
|
||||||
@ -1789,7 +1896,7 @@ func TestPostBindPlugin(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
registry, prof := initRegistryAndConfig(t, preBindPlugin, postBindPlugin)
|
registry, prof := initRegistryAndConfig(t, preBindPlugin, postBindPlugin)
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -1881,7 +1988,7 @@ func TestPermitPlugin(t *testing.T) {
|
|||||||
perPlugin := &PermitPlugin{name: permitPluginName}
|
perPlugin := &PermitPlugin{name: permitPluginName}
|
||||||
registry, prof := initRegistryAndConfig(t, perPlugin)
|
registry, prof := initRegistryAndConfig(t, perPlugin)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -1931,7 +2038,7 @@ func TestMultiplePermitPlugins(t *testing.T) {
|
|||||||
registry, prof := initRegistryAndConfig(t, perPlugin1, perPlugin2)
|
registry, prof := initRegistryAndConfig(t, perPlugin1, perPlugin2)
|
||||||
|
|
||||||
// Create the API server and the scheduler with the test plugin set.
|
// Create the API server and the scheduler with the test plugin set.
|
||||||
testCtx, _ := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "multi-permit-plugin", nil), 2,
|
testCtx, _ := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "multi-permit-plugin", nil), 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
|
|
||||||
@ -1983,7 +2090,7 @@ func TestPermitPluginsCancelled(t *testing.T) {
|
|||||||
registry, prof := initRegistryAndConfig(t, perPlugin1, perPlugin2)
|
registry, prof := initRegistryAndConfig(t, perPlugin1, perPlugin2)
|
||||||
|
|
||||||
// Create the API server and the scheduler with the test plugin set.
|
// Create the API server and the scheduler with the test plugin set.
|
||||||
testCtx, _ := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "permit-plugins", nil), 2,
|
testCtx, _ := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "permit-plugins", nil), 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
|
|
||||||
@ -2046,7 +2153,7 @@ func TestCoSchedulingWithPermitPlugin(t *testing.T) {
|
|||||||
permitPlugin := &PermitPlugin{name: permitPluginName}
|
permitPlugin := &PermitPlugin{name: permitPluginName}
|
||||||
registry, prof := initRegistryAndConfig(t, permitPlugin)
|
registry, prof := initRegistryAndConfig(t, permitPlugin)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -2128,7 +2235,7 @@ func TestFilterPlugin(t *testing.T) {
|
|||||||
filterPlugin := &FilterPlugin{}
|
filterPlugin := &FilterPlugin{}
|
||||||
registry, prof := initRegistryAndConfig(t, filterPlugin)
|
registry, prof := initRegistryAndConfig(t, filterPlugin)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 1,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 1, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -2185,7 +2292,7 @@ func TestPreScorePlugin(t *testing.T) {
|
|||||||
preScorePlugin := &PreScorePlugin{}
|
preScorePlugin := &PreScorePlugin{}
|
||||||
registry, prof := initRegistryAndConfig(t, preScorePlugin)
|
registry, prof := initRegistryAndConfig(t, preScorePlugin)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -2245,7 +2352,7 @@ func TestPreEnqueuePlugin(t *testing.T) {
|
|||||||
preFilterPlugin := &PreFilterPlugin{}
|
preFilterPlugin := &PreFilterPlugin{}
|
||||||
registry, prof := initRegistryAndConfig(t, enqueuePlugin, preFilterPlugin)
|
registry, prof := initRegistryAndConfig(t, enqueuePlugin, preFilterPlugin)
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 1,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 1, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
@ -2377,7 +2484,7 @@ func TestPreemptWithPermitPlugin(t *testing.T) {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 0,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 0, true,
|
||||||
scheduler.WithProfiles(cfg.Profiles...),
|
scheduler.WithProfiles(cfg.Profiles...),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
||||||
)
|
)
|
||||||
@ -2557,7 +2664,7 @@ func TestActivatePods(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Create the API server and the scheduler with the test plugin set.
|
// Create the API server and the scheduler with the test plugin set.
|
||||||
testCtx, _ := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "job-plugin", nil), 1,
|
testCtx, _ := schedulerutils.InitTestSchedulerForFrameworkTest(t, testutils.InitTestAPIServer(t, "job-plugin", nil), 1, true,
|
||||||
scheduler.WithProfiles(cfg.Profiles...),
|
scheduler.WithProfiles(cfg.Profiles...),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
|
|
||||||
@ -2730,7 +2837,7 @@ func TestPreEnqueuePluginEventsToRegister(t *testing.T) {
|
|||||||
}},
|
}},
|
||||||
})
|
})
|
||||||
|
|
||||||
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := schedulerutils.InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(cfg.Profiles...),
|
scheduler.WithProfiles(cfg.Profiles...),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
scheduler.WithFrameworkOutOfTreeRegistry(registry),
|
||||||
)
|
)
|
||||||
|
@ -205,7 +205,7 @@ func TestReScheduling(t *testing.T) {
|
|||||||
// Create a plugin registry for testing. Register only a permit plugin.
|
// Create a plugin registry for testing. Register only a permit plugin.
|
||||||
registry, prof := InitRegistryAndConfig(t, nil, test.plugins...)
|
registry, prof := InitRegistryAndConfig(t, nil, test.plugins...)
|
||||||
|
|
||||||
testCtx, teardown := InitTestSchedulerForFrameworkTest(t, testContext, 2,
|
testCtx, teardown := InitTestSchedulerForFrameworkTest(t, testContext, 2, true,
|
||||||
scheduler.WithProfiles(prof),
|
scheduler.WithProfiles(prof),
|
||||||
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
scheduler.WithFrameworkOutOfTreeRegistry(registry))
|
||||||
defer teardown()
|
defer teardown()
|
||||||
|
@ -31,6 +31,7 @@ import (
|
|||||||
configtesting "k8s.io/kubernetes/pkg/scheduler/apis/config/testing"
|
configtesting "k8s.io/kubernetes/pkg/scheduler/apis/config/testing"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/framework"
|
"k8s.io/kubernetes/pkg/scheduler/framework"
|
||||||
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder"
|
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultbinder"
|
||||||
|
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/queuesort"
|
||||||
frameworkruntime "k8s.io/kubernetes/pkg/scheduler/framework/runtime"
|
frameworkruntime "k8s.io/kubernetes/pkg/scheduler/framework/runtime"
|
||||||
st "k8s.io/kubernetes/pkg/scheduler/testing"
|
st "k8s.io/kubernetes/pkg/scheduler/testing"
|
||||||
testutils "k8s.io/kubernetes/test/integration/util"
|
testutils "k8s.io/kubernetes/test/integration/util"
|
||||||
@ -44,10 +45,12 @@ import (
|
|||||||
// This should only be called when you want to kill the scheduler alone, away from apiserver.
|
// This should only be called when you want to kill the scheduler alone, away from apiserver.
|
||||||
// For example, in scheduler integration tests, recreating apiserver is performance consuming,
|
// For example, in scheduler integration tests, recreating apiserver is performance consuming,
|
||||||
// then shutdown the scheduler and recreate it between each test case is a better approach.
|
// then shutdown the scheduler and recreate it between each test case is a better approach.
|
||||||
func InitTestSchedulerForFrameworkTest(t *testing.T, testCtx *testutils.TestContext, nodeCount int, opts ...scheduler.Option) (*testutils.TestContext, testutils.ShutdownFunc) {
|
func InitTestSchedulerForFrameworkTest(t *testing.T, testCtx *testutils.TestContext, nodeCount int, runScheduler bool, opts ...scheduler.Option) (*testutils.TestContext, testutils.ShutdownFunc) {
|
||||||
testCtx = testutils.InitTestSchedulerWithOptions(t, testCtx, 0, opts...)
|
testCtx = testutils.InitTestSchedulerWithOptions(t, testCtx, 0, opts...)
|
||||||
testutils.SyncSchedulerInformerFactory(testCtx)
|
testutils.SyncSchedulerInformerFactory(testCtx)
|
||||||
go testCtx.Scheduler.Run(testCtx.SchedulerCtx)
|
if runScheduler {
|
||||||
|
go testCtx.Scheduler.Run(testCtx.SchedulerCtx)
|
||||||
|
}
|
||||||
|
|
||||||
if nodeCount > 0 {
|
if nodeCount > 0 {
|
||||||
if _, err := testutils.CreateAndWaitForNodesInCache(testCtx, "test-node", st.MakeNode(), nodeCount); err != nil {
|
if _, err := testutils.CreateAndWaitForNodesInCache(testCtx, "test-node", st.MakeNode(), nodeCount); err != nil {
|
||||||
@ -105,6 +108,10 @@ func InitRegistryAndConfig(t *testing.T, factory func(plugin framework.Plugin) f
|
|||||||
plugin := configv1.Plugin{Name: p.Name()}
|
plugin := configv1.Plugin{Name: p.Name()}
|
||||||
|
|
||||||
switch p.(type) {
|
switch p.(type) {
|
||||||
|
case framework.QueueSortPlugin:
|
||||||
|
pls.QueueSort.Enabled = append(pls.QueueSort.Enabled, plugin)
|
||||||
|
// It's intentional to disable the PrioritySort plugin.
|
||||||
|
pls.QueueSort.Disabled = []configv1.Plugin{{Name: queuesort.Name}}
|
||||||
case framework.PreEnqueuePlugin:
|
case framework.PreEnqueuePlugin:
|
||||||
pls.PreEnqueue.Enabled = append(pls.PreEnqueue.Enabled, plugin)
|
pls.PreEnqueue.Enabled = append(pls.PreEnqueue.Enabled, plugin)
|
||||||
case framework.PreFilterPlugin:
|
case framework.PreFilterPlugin:
|
||||||
|
Loading…
Reference in New Issue
Block a user