move SchedulerExtender interface to pkg/scheduler/framework/v1alpha1

This commit is contained in:
Wei Huang 2020-05-12 00:12:24 -07:00
parent e4f878ea3a
commit eb17b7559c
No known key found for this signature in database
GPG Key ID: BE5E9752F8B6E005
7 changed files with 22 additions and 67 deletions

View File

@ -38,54 +38,7 @@ const (
DefaultExtenderTimeout = 5 * time.Second DefaultExtenderTimeout = 5 * time.Second
) )
// SchedulerExtender is an interface for external processes to influence scheduling // HTTPExtender implements the Extender interface.
// 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.
type HTTPExtender struct { type HTTPExtender struct {
extenderURL string extenderURL string
preemptVerb string preemptVerb string
@ -130,7 +83,7 @@ func makeTransport(config *schedulerapi.Extender) (http.RoundTripper, error) {
} }
// NewHTTPExtender creates an HTTPExtender object. // 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 { if config.HTTPTimeout.Nanoseconds() == 0 {
config.HTTPTimeout = time.Duration(DefaultExtenderTimeout) config.HTTPTimeout = time.Duration(DefaultExtenderTimeout)
} }

View File

@ -353,7 +353,7 @@ func (f *FakeExtender) IsInterested(pod *v1.Pod) bool {
return !f.unInterested return !f.unInterested
} }
var _ SchedulerExtender = &FakeExtender{} var _ framework.Extender = &FakeExtender{}
func TestGenericSchedulerWithExtenders(t *testing.T) { func TestGenericSchedulerWithExtenders(t *testing.T) {
tests := []struct { tests := []struct {
@ -575,7 +575,7 @@ func TestGenericSchedulerWithExtenders(t *testing.T) {
client := clientsetfake.NewSimpleClientset() client := clientsetfake.NewSimpleClientset()
informerFactory := informers.NewSharedInformerFactory(client, 0) informerFactory := informers.NewSharedInformerFactory(client, 0)
extenders := []SchedulerExtender{} extenders := []framework.Extender{}
for ii := range test.extenders { for ii := range test.extenders {
extenders = append(extenders, &test.extenders[ii]) extenders = append(extenders, &test.extenders[ii])
} }

View File

@ -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) 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 // Extenders returns a slice of extender config. This is exposed for
// testing. // testing.
Extenders() []SchedulerExtender Extenders() []framework.Extender
} }
// ScheduleResult represents the result of one pod scheduled. It will contain // ScheduleResult represents the result of one pod scheduled. It will contain
@ -125,7 +125,7 @@ type ScheduleResult struct {
type genericScheduler struct { type genericScheduler struct {
cache internalcache.Cache cache internalcache.Cache
schedulingQueue internalqueue.SchedulingQueue schedulingQueue internalqueue.SchedulingQueue
extenders []SchedulerExtender extenders []framework.Extender
nodeInfoSnapshot *internalcache.Snapshot nodeInfoSnapshot *internalcache.Snapshot
pvcLister corelisters.PersistentVolumeClaimLister pvcLister corelisters.PersistentVolumeClaimLister
pdbLister policylisters.PodDisruptionBudgetLister pdbLister policylisters.PodDisruptionBudgetLister
@ -210,7 +210,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, prof *profile.Profile,
}, err }, err
} }
func (g *genericScheduler) Extenders() []SchedulerExtender { func (g *genericScheduler) Extenders() []framework.Extender {
return g.extenders return g.extenders
} }
@ -1103,7 +1103,7 @@ func NewGenericScheduler(
cache internalcache.Cache, cache internalcache.Cache,
podQueue internalqueue.SchedulingQueue, podQueue internalqueue.SchedulingQueue,
nodeInfoSnapshot *internalcache.Snapshot, nodeInfoSnapshot *internalcache.Snapshot,
extenders []SchedulerExtender, extenders []framework.Extender,
pvcLister corelisters.PersistentVolumeClaimLister, pvcLister corelisters.PersistentVolumeClaimLister,
pdbLister policylisters.PodDisruptionBudgetLister, pdbLister policylisters.PodDisruptionBudgetLister,
disablePreemption bool, disablePreemption bool,

View File

@ -813,7 +813,7 @@ func TestGenericScheduler(t *testing.T) {
cache, cache,
internalqueue.NewSchedulingQueue(nil), internalqueue.NewSchedulingQueue(nil),
snapshot, snapshot,
[]SchedulerExtender{}, []framework.Extender{},
pvcLister, pvcLister,
informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(),
false, false,
@ -1134,7 +1134,7 @@ func TestZeroRequest(t *testing.T) {
nil, nil,
nil, nil,
emptySnapshot, emptySnapshot,
[]SchedulerExtender{}, []framework.Extender{},
nil, nil,
nil, nil,
false, false,
@ -1613,7 +1613,7 @@ func TestSelectNodesForPreemption(t *testing.T) {
nil, nil,
internalqueue.NewSchedulingQueue(nil), internalqueue.NewSchedulingQueue(nil),
snapshot, snapshot,
[]SchedulerExtender{}, []framework.Extender{},
nil, nil,
informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(),
false, false,
@ -2391,7 +2391,7 @@ func TestPreempt(t *testing.T) {
cachedNodeInfo.SetNode(node) cachedNodeInfo.SetNode(node)
cachedNodeInfoMap[node.Name] = cachedNodeInfo cachedNodeInfoMap[node.Name] = cachedNodeInfo
} }
var extenders []SchedulerExtender var extenders []framework.Extender
for _, extender := range test.extenders { for _, extender := range test.extenders {
// Set nodeInfoMap as extenders cached node information. // Set nodeInfoMap as extenders cached node information.
extender.cachedNodeNameToInfo = cachedNodeInfoMap extender.cachedNodeNameToInfo = cachedNodeInfoMap

View File

@ -126,10 +126,10 @@ func (c *Configurator) buildFramework(p schedulerapi.KubeSchedulerProfile) (fram
// create a scheduler from a set of registered plugins. // create a scheduler from a set of registered plugins.
func (c *Configurator) create() (*Scheduler, error) { func (c *Configurator) create() (*Scheduler, error) {
var extenders []core.SchedulerExtender var extenders []framework.Extender
var ignoredExtendedResources []string var ignoredExtendedResources []string
if len(c.extenders) != 0 { if len(c.extenders) != 0 {
var ignorableExtenders []core.SchedulerExtender var ignorableExtenders []framework.Extender
for ii := range c.extenders { for ii := range c.extenders {
klog.V(2).Infof("Creating extender with config %+v", c.extenders[ii]) klog.V(2).Infof("Creating extender with config %+v", c.extenders[ii])
extender, err := core.NewHTTPExtender(&c.extenders[ii]) extender, err := core.NewHTTPExtender(&c.extenders[ii])

View File

@ -4,6 +4,7 @@ go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"cycle_state.go", "cycle_state.go",
"extender.go",
"framework.go", "framework.go",
"interface.go", "interface.go",
"listers.go", "listers.go",
@ -34,6 +35,7 @@ go_library(
"//staging/src/k8s.io/client-go/kubernetes:go_default_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/component-base/metrics:go_default_library",
"//staging/src/k8s.io/kube-scheduler/config/v1alpha2: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/k8s.io/klog:go_default_library",
"//vendor/sigs.k8s.io/yaml:go_default_library", "//vendor/sigs.k8s.io/yaml:go_default_library",
], ],

View File

@ -141,7 +141,7 @@ func (es mockScheduler) Schedule(ctx context.Context, profile *profile.Profile,
return es.result, es.err return es.result, es.err
} }
func (es mockScheduler) Extenders() []core.SchedulerExtender { func (es mockScheduler) Extenders() []framework.Extender {
return nil 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) { 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, scache,
internalqueue.NewSchedulingQueue(nil), internalqueue.NewSchedulingQueue(nil),
internalcache.NewEmptySnapshot(), internalcache.NewEmptySnapshot(),
[]core.SchedulerExtender{}, []framework.Extender{},
informerFactory.Core().V1().PersistentVolumeClaims().Lister(), informerFactory.Core().V1().PersistentVolumeClaims().Lister(),
informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(),
false, false,
@ -1104,14 +1104,14 @@ priorities:
func TestSchedulerBinding(t *testing.T) { func TestSchedulerBinding(t *testing.T) {
table := []struct { table := []struct {
podName string podName string
extenders []core.SchedulerExtender extenders []framework.Extender
wantBinderID int wantBinderID int
name string name string
}{ }{
{ {
name: "the extender is not a binder", name: "the extender is not a binder",
podName: "pod0", podName: "pod0",
extenders: []core.SchedulerExtender{ extenders: []framework.Extender{
&fakeExtender{isBinder: false, interestedPodName: "pod0"}, &fakeExtender{isBinder: false, interestedPodName: "pod0"},
}, },
wantBinderID: -1, // default binding. 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", name: "one of the extenders is a binder and interested in pod",
podName: "pod0", podName: "pod0",
extenders: []core.SchedulerExtender{ extenders: []framework.Extender{
&fakeExtender{isBinder: false, interestedPodName: "pod0"}, &fakeExtender{isBinder: false, interestedPodName: "pod0"},
&fakeExtender{isBinder: true, 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", name: "one of the extenders is a binder, but not interested in pod",
podName: "pod1", podName: "pod1",
extenders: []core.SchedulerExtender{ extenders: []framework.Extender{
&fakeExtender{isBinder: false, interestedPodName: "pod1"}, &fakeExtender{isBinder: false, interestedPodName: "pod1"},
&fakeExtender{isBinder: true, interestedPodName: "pod0"}, &fakeExtender{isBinder: true, interestedPodName: "pod0"},
}, },