@@ -28,7 +28,6 @@ import (
28
28
utilnet "k8s.io/apimachinery/pkg/util/net"
29
29
"k8s.io/apimachinery/pkg/util/sets"
30
30
restclient "k8s.io/client-go/rest"
31
- "k8s.io/kubernetes/pkg/scheduler/algorithm"
32
31
schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/config"
33
32
extenderv1 "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1"
34
33
"k8s.io/kubernetes/pkg/scheduler/listers"
@@ -40,7 +39,55 @@ const (
40
39
DefaultExtenderTimeout = 5 * time .Second
41
40
)
42
41
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.
44
91
type HTTPExtender struct {
45
92
extenderURL string
46
93
preemptVerb string
@@ -85,7 +132,7 @@ func makeTransport(config *schedulerapi.Extender) (http.RoundTripper, error) {
85
132
}
86
133
87
134
// NewHTTPExtender creates an HTTPExtender object.
88
- func NewHTTPExtender (config * schedulerapi.Extender ) (algorithm. SchedulerExtender , error ) {
135
+ func NewHTTPExtender (config * schedulerapi.Extender ) (SchedulerExtender , error ) {
89
136
if config .HTTPTimeout .Nanoseconds () == 0 {
90
137
config .HTTPTimeout = time .Duration (DefaultExtenderTimeout )
91
138
}
0 commit comments