diff --git a/pkg/scheduler/core/extender.go b/pkg/scheduler/core/extender.go index 76bb49db6f5..b0fca92189c 100644 --- a/pkg/scheduler/core/extender.go +++ b/pkg/scheduler/core/extender.go @@ -38,54 +38,7 @@ const ( DefaultExtenderTimeout = 5 * time.Second ) -// SchedulerExtender is an interface for external processes to influence scheduling -// decisions made by Kubernetes. This is typically needed for resources not directly -// managed by Kubernetes. -type SchedulerExtender interface { - // Name returns a unique name that identifies the extender. - Name() string - - // Filter based on extender-implemented predicate functions. The filtered list is - // expected to be a subset of the supplied list. failedNodesMap optionally contains - // the list of failed nodes and failure reasons. - Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, err error) - - // Prioritize based on extender-implemented priority functions. The returned scores & weight - // are used to compute the weighted score for an extender. The weighted scores are added to - // the scores computed by Kubernetes scheduler. The total scores are used to do the host selection. - Prioritize(pod *v1.Pod, nodes []*v1.Node) (hostPriorities *extenderv1.HostPriorityList, weight int64, err error) - - // Bind delegates the action of binding a pod to a node to the extender. - Bind(binding *v1.Binding) error - - // IsBinder returns whether this extender is configured for the Bind method. - IsBinder() bool - - // IsInterested returns true if at least one extended resource requested by - // this pod is managed by this extender. - IsInterested(pod *v1.Pod) bool - - // ProcessPreemption returns nodes with their victim pods processed by extender based on - // given: - // 1. Pod to schedule - // 2. Candidate nodes and victim pods (nodeToVictims) generated by previous scheduling process. - // The possible changes made by extender may include: - // 1. Subset of given candidate nodes after preemption phase of extender. - // 2. A different set of victim pod for every given candidate node after preemption phase of extender. - ProcessPreemption( - pod *v1.Pod, - nodeToVictims map[string]*extenderv1.Victims, - nodeInfos framework.NodeInfoLister) (map[string]*extenderv1.Victims, error) - - // SupportsPreemption returns if the scheduler extender support preemption or not. - SupportsPreemption() bool - - // IsIgnorable returns true indicates scheduling should not fail when this extender - // is unavailable. This gives scheduler ability to fail fast and tolerate non-critical extenders as well. - IsIgnorable() bool -} - -// HTTPExtender implements the SchedulerExtender interface. +// HTTPExtender implements the Extender interface. type HTTPExtender struct { extenderURL string preemptVerb string @@ -130,7 +83,7 @@ func makeTransport(config *schedulerapi.Extender) (http.RoundTripper, error) { } // NewHTTPExtender creates an HTTPExtender object. -func NewHTTPExtender(config *schedulerapi.Extender) (SchedulerExtender, error) { +func NewHTTPExtender(config *schedulerapi.Extender) (framework.Extender, error) { if config.HTTPTimeout.Nanoseconds() == 0 { config.HTTPTimeout = time.Duration(DefaultExtenderTimeout) } diff --git a/pkg/scheduler/core/extender_test.go b/pkg/scheduler/core/extender_test.go index 0c43b37eb42..3df352f79f5 100644 --- a/pkg/scheduler/core/extender_test.go +++ b/pkg/scheduler/core/extender_test.go @@ -353,7 +353,7 @@ func (f *FakeExtender) IsInterested(pod *v1.Pod) bool { return !f.unInterested } -var _ SchedulerExtender = &FakeExtender{} +var _ framework.Extender = &FakeExtender{} func TestGenericSchedulerWithExtenders(t *testing.T) { tests := []struct { @@ -575,7 +575,7 @@ func TestGenericSchedulerWithExtenders(t *testing.T) { client := clientsetfake.NewSimpleClientset() informerFactory := informers.NewSharedInformerFactory(client, 0) - extenders := []SchedulerExtender{} + extenders := []framework.Extender{} for ii := range test.extenders { extenders = append(extenders, &test.extenders[ii]) } diff --git a/pkg/scheduler/core/generic_scheduler.go b/pkg/scheduler/core/generic_scheduler.go index b5d848879e1..3f237383298 100644 --- a/pkg/scheduler/core/generic_scheduler.go +++ b/pkg/scheduler/core/generic_scheduler.go @@ -108,7 +108,7 @@ type ScheduleAlgorithm interface { Preempt(context.Context, *profile.Profile, *framework.CycleState, *v1.Pod, error) (selectedNode string, preemptedPods []*v1.Pod, cleanupNominatedPods []*v1.Pod, err error) // Extenders returns a slice of extender config. This is exposed for // testing. - Extenders() []SchedulerExtender + Extenders() []framework.Extender } // ScheduleResult represents the result of one pod scheduled. It will contain @@ -125,7 +125,7 @@ type ScheduleResult struct { type genericScheduler struct { cache internalcache.Cache schedulingQueue internalqueue.SchedulingQueue - extenders []SchedulerExtender + extenders []framework.Extender nodeInfoSnapshot *internalcache.Snapshot pvcLister corelisters.PersistentVolumeClaimLister pdbLister policylisters.PodDisruptionBudgetLister @@ -210,7 +210,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, prof *profile.Profile, }, err } -func (g *genericScheduler) Extenders() []SchedulerExtender { +func (g *genericScheduler) Extenders() []framework.Extender { return g.extenders } @@ -1103,7 +1103,7 @@ func NewGenericScheduler( cache internalcache.Cache, podQueue internalqueue.SchedulingQueue, nodeInfoSnapshot *internalcache.Snapshot, - extenders []SchedulerExtender, + extenders []framework.Extender, pvcLister corelisters.PersistentVolumeClaimLister, pdbLister policylisters.PodDisruptionBudgetLister, disablePreemption bool, diff --git a/pkg/scheduler/core/generic_scheduler_test.go b/pkg/scheduler/core/generic_scheduler_test.go index ed04735610b..dd6457230b6 100644 --- a/pkg/scheduler/core/generic_scheduler_test.go +++ b/pkg/scheduler/core/generic_scheduler_test.go @@ -813,7 +813,7 @@ func TestGenericScheduler(t *testing.T) { cache, internalqueue.NewSchedulingQueue(nil), snapshot, - []SchedulerExtender{}, + []framework.Extender{}, pvcLister, informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), false, @@ -1134,7 +1134,7 @@ func TestZeroRequest(t *testing.T) { nil, nil, emptySnapshot, - []SchedulerExtender{}, + []framework.Extender{}, nil, nil, false, @@ -1613,7 +1613,7 @@ func TestSelectNodesForPreemption(t *testing.T) { nil, internalqueue.NewSchedulingQueue(nil), snapshot, - []SchedulerExtender{}, + []framework.Extender{}, nil, informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), false, @@ -2391,7 +2391,7 @@ func TestPreempt(t *testing.T) { cachedNodeInfo.SetNode(node) cachedNodeInfoMap[node.Name] = cachedNodeInfo } - var extenders []SchedulerExtender + var extenders []framework.Extender for _, extender := range test.extenders { // Set nodeInfoMap as extenders cached node information. extender.cachedNodeNameToInfo = cachedNodeInfoMap diff --git a/pkg/scheduler/factory.go b/pkg/scheduler/factory.go index a5fe324a8e1..8b50f23d384 100644 --- a/pkg/scheduler/factory.go +++ b/pkg/scheduler/factory.go @@ -126,10 +126,10 @@ func (c *Configurator) buildFramework(p schedulerapi.KubeSchedulerProfile) (fram // create a scheduler from a set of registered plugins. func (c *Configurator) create() (*Scheduler, error) { - var extenders []core.SchedulerExtender + var extenders []framework.Extender var ignoredExtendedResources []string if len(c.extenders) != 0 { - var ignorableExtenders []core.SchedulerExtender + var ignorableExtenders []framework.Extender for ii := range c.extenders { klog.V(2).Infof("Creating extender with config %+v", c.extenders[ii]) extender, err := core.NewHTTPExtender(&c.extenders[ii]) diff --git a/pkg/scheduler/framework/v1alpha1/BUILD b/pkg/scheduler/framework/v1alpha1/BUILD index 341222deb9d..3910c739490 100644 --- a/pkg/scheduler/framework/v1alpha1/BUILD +++ b/pkg/scheduler/framework/v1alpha1/BUILD @@ -4,6 +4,7 @@ go_library( name = "go_default_library", srcs = [ "cycle_state.go", + "extender.go", "framework.go", "interface.go", "listers.go", @@ -34,6 +35,7 @@ go_library( "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library", "//staging/src/k8s.io/kube-scheduler/config/v1alpha2:go_default_library", + "//staging/src/k8s.io/kube-scheduler/extender/v1:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/sigs.k8s.io/yaml:go_default_library", ], diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go index 03b2bc3f743..0a58adefe12 100644 --- a/pkg/scheduler/scheduler_test.go +++ b/pkg/scheduler/scheduler_test.go @@ -141,7 +141,7 @@ func (es mockScheduler) Schedule(ctx context.Context, profile *profile.Profile, return es.result, es.err } -func (es mockScheduler) Extenders() []core.SchedulerExtender { +func (es mockScheduler) Extenders() []framework.Extender { return nil } func (es mockScheduler) Preempt(ctx context.Context, i *profile.Profile, state *framework.CycleState, pod *v1.Pod, scheduleErr error) (string, []*v1.Pod, []*v1.Pod, error) { @@ -815,7 +815,7 @@ func setupTestScheduler(queuedPodStore *clientcache.FIFO, scache internalcache.C scache, internalqueue.NewSchedulingQueue(nil), internalcache.NewEmptySnapshot(), - []core.SchedulerExtender{}, + []framework.Extender{}, informerFactory.Core().V1().PersistentVolumeClaims().Lister(), informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), false, @@ -1104,14 +1104,14 @@ priorities: func TestSchedulerBinding(t *testing.T) { table := []struct { podName string - extenders []core.SchedulerExtender + extenders []framework.Extender wantBinderID int name string }{ { name: "the extender is not a binder", podName: "pod0", - extenders: []core.SchedulerExtender{ + extenders: []framework.Extender{ &fakeExtender{isBinder: false, interestedPodName: "pod0"}, }, wantBinderID: -1, // default binding. @@ -1119,7 +1119,7 @@ func TestSchedulerBinding(t *testing.T) { { name: "one of the extenders is a binder and interested in pod", podName: "pod0", - extenders: []core.SchedulerExtender{ + extenders: []framework.Extender{ &fakeExtender{isBinder: false, interestedPodName: "pod0"}, &fakeExtender{isBinder: true, interestedPodName: "pod0"}, }, @@ -1128,7 +1128,7 @@ func TestSchedulerBinding(t *testing.T) { { name: "one of the extenders is a binder, but not interested in pod", podName: "pod1", - extenders: []core.SchedulerExtender{ + extenders: []framework.Extender{ &fakeExtender{isBinder: false, interestedPodName: "pod1"}, &fakeExtender{isBinder: true, interestedPodName: "pod0"}, },