Skip to content

Commit 37f98ac

Browse files
authored
Merge pull request kubernetes#87401 from zouyee/move
Move scheduler's SchedulerExtender interface to core/extenders.go
2 parents c014515 + d6b449b commit 37f98ac

File tree

10 files changed

+71
-112
lines changed

10 files changed

+71
-112
lines changed

pkg/scheduler/BUILD

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ go_library(
1212
deps = [
1313
"//pkg/api/v1/pod:go_default_library",
1414
"//pkg/features:go_default_library",
15-
"//pkg/scheduler/algorithm:go_default_library",
1615
"//pkg/scheduler/algorithmprovider:go_default_library",
1716
"//pkg/scheduler/apis/config:go_default_library",
1817
"//pkg/scheduler/apis/config/scheme:go_default_library",
@@ -62,7 +61,6 @@ go_test(
6261
"//pkg/api/testing:go_default_library",
6362
"//pkg/controller/volume/scheduling:go_default_library",
6463
"//pkg/features:go_default_library",
65-
"//pkg/scheduler/algorithm:go_default_library",
6664
"//pkg/scheduler/apis/config:go_default_library",
6765
"//pkg/scheduler/apis/config/scheme:go_default_library",
6866
"//pkg/scheduler/apis/extender/v1:go_default_library",

pkg/scheduler/algorithm/BUILD

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,9 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library")
22

33
go_library(
44
name = "go_default_library",
5-
srcs = [
6-
"doc.go",
7-
"scheduler_interface.go",
8-
],
5+
srcs = ["doc.go"],
96
importpath = "k8s.io/kubernetes/pkg/scheduler/algorithm",
107
visibility = ["//visibility:public"],
11-
deps = [
12-
"//pkg/scheduler/apis/extender/v1:go_default_library",
13-
"//pkg/scheduler/listers:go_default_library",
14-
"//staging/src/k8s.io/api/core/v1:go_default_library",
15-
],
168
)
179

1810
filegroup(

pkg/scheduler/algorithm/scheduler_interface.go

Lines changed: 0 additions & 71 deletions
This file was deleted.

pkg/scheduler/core/BUILD

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ go_library(
1010
visibility = ["//visibility:public"],
1111
deps = [
1212
"//pkg/api/v1/pod:go_default_library",
13-
"//pkg/scheduler/algorithm:go_default_library",
1413
"//pkg/scheduler/apis/config:go_default_library",
1514
"//pkg/scheduler/apis/extender/v1:go_default_library",
1615
"//pkg/scheduler/framework/v1alpha1:go_default_library",
@@ -45,7 +44,6 @@ go_test(
4544
embed = [":go_default_library"],
4645
deps = [
4746
"//pkg/api/v1/pod:go_default_library",
48-
"//pkg/scheduler/algorithm:go_default_library",
4947
"//pkg/scheduler/apis/config:go_default_library",
5048
"//pkg/scheduler/apis/extender/v1:go_default_library",
5149
"//pkg/scheduler/framework/plugins/defaultpodtopologyspread:go_default_library",

pkg/scheduler/core/extender.go

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import (
2828
utilnet "k8s.io/apimachinery/pkg/util/net"
2929
"k8s.io/apimachinery/pkg/util/sets"
3030
restclient "k8s.io/client-go/rest"
31-
"k8s.io/kubernetes/pkg/scheduler/algorithm"
3231
schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config"
3332
extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1"
3433
"k8s.io/kubernetes/pkg/scheduler/listers"
@@ -40,7 +39,55 @@ const (
4039
DefaultExtenderTimeout = 5 * time.Second
4140
)
4241

43-
// HTTPExtender implements the algorithm.SchedulerExtender interface.
42+
// SchedulerExtender is an interface for external processes to influence scheduling
43+
// decisions made by Kubernetes. This is typically needed for resources not directly
44+
// managed by Kubernetes.
45+
type SchedulerExtender interface {
46+
// Name returns a unique name that identifies the extender.
47+
Name() string
48+
49+
// Filter based on extender-implemented predicate functions. The filtered list is
50+
// expected to be a subset of the supplied list. failedNodesMap optionally contains
51+
// the list of failed nodes and failure reasons.
52+
Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, err error)
53+
54+
// Prioritize based on extender-implemented priority functions. The returned scores & weight
55+
// are used to compute the weighted score for an extender. The weighted scores are added to
56+
// the scores computed by Kubernetes scheduler. The total scores are used to do the host selection.
57+
Prioritize(pod *v1.Pod, nodes []*v1.Node) (hostPriorities *extenderv1.HostPriorityList, weight int64, err error)
58+
59+
// Bind delegates the action of binding a pod to a node to the extender.
60+
Bind(binding *v1.Binding) error
61+
62+
// IsBinder returns whether this extender is configured for the Bind method.
63+
IsBinder() bool
64+
65+
// IsInterested returns true if at least one extended resource requested by
66+
// this pod is managed by this extender.
67+
IsInterested(pod *v1.Pod) bool
68+
69+
// ProcessPreemption returns nodes with their victim pods processed by extender based on
70+
// given:
71+
// 1. Pod to schedule
72+
// 2. Candidate nodes and victim pods (nodeToVictims) generated by previous scheduling process.
73+
// 3. nodeNameToInfo to restore v1.Node from node name if extender cache is enabled.
74+
// The possible changes made by extender may include:
75+
// 1. Subset of given candidate nodes after preemption phase of extender.
76+
// 2. A different set of victim pod for every given candidate node after preemption phase of extender.
77+
ProcessPreemption(
78+
pod *v1.Pod,
79+
nodeToVictims map[*v1.Node]*extenderv1.Victims,
80+
nodeInfos listers.NodeInfoLister) (map[*v1.Node]*extenderv1.Victims, error)
81+
82+
// SupportsPreemption returns if the scheduler extender support preemption or not.
83+
SupportsPreemption() bool
84+
85+
// IsIgnorable returns true indicates scheduling should not fail when this extender
86+
// is unavailable. This gives scheduler ability to fail fast and tolerate non-critical extenders as well.
87+
IsIgnorable() bool
88+
}
89+
90+
// HTTPExtender implements the SchedulerExtender interface.
4491
type HTTPExtender struct {
4592
extenderURL string
4693
preemptVerb string
@@ -85,7 +132,7 @@ func makeTransport(config *schedulerapi.Extender) (http.RoundTripper, error) {
85132
}
86133

87134
// NewHTTPExtender creates an HTTPExtender object.
88-
func NewHTTPExtender(config *schedulerapi.Extender) (algorithm.SchedulerExtender, error) {
135+
func NewHTTPExtender(config *schedulerapi.Extender) (SchedulerExtender, error) {
89136
if config.HTTPTimeout.Nanoseconds() == 0 {
90137
config.HTTPTimeout = time.Duration(DefaultExtenderTimeout)
91138
}

pkg/scheduler/core/extender_test.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import (
3333
"k8s.io/client-go/informers"
3434
clientsetfake "k8s.io/client-go/kubernetes/fake"
3535
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
36-
"k8s.io/kubernetes/pkg/scheduler/algorithm"
3736
schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config"
3837
extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1"
3938
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/queuesort"
@@ -353,7 +352,7 @@ func (f *FakeExtender) IsInterested(pod *v1.Pod) bool {
353352
return !f.unInterested
354353
}
355354

356-
var _ algorithm.SchedulerExtender = &FakeExtender{}
355+
var _ SchedulerExtender = &FakeExtender{}
357356

358357
func TestGenericSchedulerWithExtenders(t *testing.T) {
359358
tests := []struct {
@@ -566,7 +565,7 @@ func TestGenericSchedulerWithExtenders(t *testing.T) {
566565
client := clientsetfake.NewSimpleClientset()
567566
informerFactory := informers.NewSharedInformerFactory(client, 0)
568567

569-
extenders := []algorithm.SchedulerExtender{}
568+
extenders := []SchedulerExtender{}
570569
for ii := range test.extenders {
571570
extenders = append(extenders, &test.extenders[ii])
572571
}

pkg/scheduler/core/generic_scheduler.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import (
3737
policylisters "k8s.io/client-go/listers/policy/v1beta1"
3838
"k8s.io/client-go/util/workqueue"
3939
podutil "k8s.io/kubernetes/pkg/api/v1/pod"
40-
"k8s.io/kubernetes/pkg/scheduler/algorithm"
4140
extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1"
4241
framework "k8s.io/kubernetes/pkg/scheduler/framework/v1alpha1"
4342
internalcache "k8s.io/kubernetes/pkg/scheduler/internal/cache"
@@ -111,7 +110,7 @@ type ScheduleAlgorithm interface {
111110
Preempt(context.Context, *framework.CycleState, *v1.Pod, error) (selectedNode *v1.Node, preemptedPods []*v1.Pod, cleanupNominatedPods []*v1.Pod, err error)
112111
// Prioritizers returns a slice of priority config. This is exposed for
113112
// testing.
114-
Extenders() []algorithm.SchedulerExtender
113+
Extenders() []SchedulerExtender
115114
// Snapshot snapshots scheduler cache and node infos. This is needed
116115
// for cluster autoscaler integration.
117116
// TODO(#85691): remove this once CA migrates to creating a Framework instead of a full scheduler.
@@ -136,7 +135,7 @@ type genericScheduler struct {
136135
cache internalcache.Cache
137136
schedulingQueue internalqueue.SchedulingQueue
138137
framework framework.Framework
139-
extenders []algorithm.SchedulerExtender
138+
extenders []SchedulerExtender
140139
nodeInfoSnapshot *internalcache.Snapshot
141140
volumeBinder *volumebinder.VolumeBinder
142141
pvcLister corelisters.PersistentVolumeClaimLister
@@ -241,7 +240,7 @@ func (g *genericScheduler) Schedule(ctx context.Context, state *framework.CycleS
241240
}, err
242241
}
243242

244-
func (g *genericScheduler) Extenders() []algorithm.SchedulerExtender {
243+
func (g *genericScheduler) Extenders() []SchedulerExtender {
245244
return g.extenders
246245
}
247246

@@ -1098,7 +1097,7 @@ func NewGenericScheduler(
10981097
podQueue internalqueue.SchedulingQueue,
10991098
nodeInfoSnapshot *internalcache.Snapshot,
11001099
framework framework.Framework,
1101-
extenders []algorithm.SchedulerExtender,
1100+
extenders []SchedulerExtender,
11021101
volumeBinder *volumebinder.VolumeBinder,
11031102
pvcLister corelisters.PersistentVolumeClaimLister,
11041103
pdbLister policylisters.PodDisruptionBudgetLister,

pkg/scheduler/core/generic_scheduler_test.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ import (
3636
"k8s.io/apimachinery/pkg/util/wait"
3737
"k8s.io/client-go/informers"
3838
clientsetfake "k8s.io/client-go/kubernetes/fake"
39-
"k8s.io/kubernetes/pkg/scheduler/algorithm"
4039
schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config"
4140
extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1"
4241
"k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpodtopologyspread"
@@ -807,7 +806,7 @@ func TestGenericScheduler(t *testing.T) {
807806
internalqueue.NewSchedulingQueue(nil),
808807
snapshot,
809808
fwk,
810-
[]algorithm.SchedulerExtender{},
809+
[]SchedulerExtender{},
811810
nil,
812811
pvcLister,
813812
informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(),
@@ -1152,7 +1151,7 @@ func TestZeroRequest(t *testing.T) {
11521151
nil,
11531152
emptySnapshot,
11541153
fwk,
1155-
[]algorithm.SchedulerExtender{},
1154+
[]SchedulerExtender{},
11561155
nil,
11571156
nil,
11581157
nil,
@@ -1611,7 +1610,7 @@ func TestSelectNodesForPreemption(t *testing.T) {
16111610
internalqueue.NewSchedulingQueue(nil),
16121611
snapshot,
16131612
fwk,
1614-
[]algorithm.SchedulerExtender{},
1613+
[]SchedulerExtender{},
16151614
nil,
16161615
nil,
16171616
informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(),
@@ -2374,7 +2373,7 @@ func TestPreempt(t *testing.T) {
23742373
cachedNodeInfo.SetNode(node)
23752374
cachedNodeInfoMap[node.Name] = cachedNodeInfo
23762375
}
2377-
var extenders []algorithm.SchedulerExtender
2376+
var extenders []SchedulerExtender
23782377
for _, extender := range test.extenders {
23792378
// Set nodeInfoMap as extenders cached node information.
23802379
extender.cachedNodeNameToInfo = cachedNodeInfoMap

pkg/scheduler/factory.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import (
3737
"k8s.io/client-go/tools/cache"
3838
"k8s.io/klog"
3939
kubefeatures "k8s.io/kubernetes/pkg/features"
40-
"k8s.io/kubernetes/pkg/scheduler/algorithm"
4140
"k8s.io/kubernetes/pkg/scheduler/algorithmprovider"
4241
schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config"
4342
"k8s.io/kubernetes/pkg/scheduler/apis/config/validation"
@@ -110,7 +109,7 @@ type Configurator struct {
110109
}
111110

112111
// create a scheduler from a set of registered plugins.
113-
func (c *Configurator) create(extenders []algorithm.SchedulerExtender) (*Scheduler, error) {
112+
func (c *Configurator) create(extenders []core.SchedulerExtender) (*Scheduler, error) {
114113
framework, err := framework.NewFramework(
115114
c.registry,
116115
c.plugins,
@@ -186,7 +185,7 @@ func (c *Configurator) createFromProvider(providerName string) (*Scheduler, erro
186185
pluginConfig = append(pluginConfig, c.pluginConfig...)
187186
c.pluginConfig = pluginConfig
188187

189-
return c.create([]algorithm.SchedulerExtender{})
188+
return c.create([]core.SchedulerExtender{})
190189
}
191190

192191
// createFromConfig creates a scheduler from the configuration file
@@ -227,9 +226,9 @@ func (c *Configurator) createFromConfig(policy schedulerapi.Policy) (*Scheduler,
227226
}
228227
}
229228

230-
var extenders []algorithm.SchedulerExtender
229+
var extenders []core.SchedulerExtender
231230
if len(policy.Extenders) != 0 {
232-
var ignorableExtenders []algorithm.SchedulerExtender
231+
var ignorableExtenders []core.SchedulerExtender
233232
var ignoredExtendedResources []string
234233
for ii := range policy.Extenders {
235234
klog.V(2).Infof("Creating extender with config %+v", policy.Extenders[ii])

0 commit comments

Comments
 (0)