// https://github.com/kubernetes/kubernetes/blob/master/pkg/scheduler/framework/extender.go#L24-L72
// Extender 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 Extender 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.
// The failedNodes and failedAndUnresolvableNodes optionally contains the list
// of failed nodes and failure reasons, except nodes in the latter are
// unresolvable.
Filter(pod *v1.Pod, nodes []*v1.Node) (filteredNodes []*v1.Node, failedNodesMap extenderv1.FailedNodesMap, failedAndUnresolvable extenderv1.FailedNodesMap, err error)
// Prioritize based on extender-implemented priority functions
// The returned scores and weight are used to compute the weighted score for an extender.
// The weighted scores are added t 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
// sInterested() 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 the extender based on the following:
// 1. Pod to schedule
// 2. Candidate nodes and victim pods (nodeNameToVictims) generated by previous scheduling process.
// The possible changes made by extender may include:
// 1. Subset of given candidate nodes after the preemption phase of extender.
// 2. A different set of victim Pods for every given candidate node after the preemption phase of extender."
ProcessPreemption(
pod *v1.Pod,
nodeNameToVictims map[string]*extenderv1.Victims,
nodeInfos NodeInfoLister,
) (map[string]*extenderv1.Victims, error)
// The SupportsPreemption() function returns whether or not the scheduler extender supports preemption.
SupportsPreemption() bool
// The IsIgnorable() function returns true, which indicates that scheduling should not fail when this extender is unavailable.
// This gives the scheduler the ability to fail fast and tolerate non-critical extenders as well.
IsIgnorable() bool
}