THPA/scheduler-extender/k8s-scheduler-extender/predicate.go
2022-08-22 16:15:23 +09:00

48 lines
1.2 KiB
Go

package main
import (
"k8s.io/api/core/v1"
schedulerapi "k8s.io/kubernetes/pkg/scheduler/apis/extender/v1"
"log"
)
type Predicate struct {
Name string
Func func(pod v1.Pod, node v1.Node) (bool, error)
}
// func (p Predicate) Handler(args schedulerapi.ExtenderArgs) *schedulerapi.ExtenderFilterResult {.....}
// input args schedulerapi.ExtenderArgs
// output extender filter result
// args.Nodes.Items contains filtered nodes from default scheduler (based on some Criterias)
func (p Predicate) Handler(args schedulerapi.ExtenderArgs) *schedulerapi.ExtenderFilterResult {
// access the API to list pods
pod := args.Pod
canSchedule := make([]v1.Node, 0, len(args.Nodes.Items))
canNotSchedule := make(map[string]string)
for _, node := range args.Nodes.Items {
//TODO: check pods distribution in map for each node
result, err := p.Func(*pod, node)
if err != nil {
canNotSchedule[node.Name] = err.Error()
log.Printf("info: $$$$$ can not schedule pod on node: %s $$$$$", node.Name)
} else {
if result {
canSchedule = append(canSchedule, node)
}
}
}
result := schedulerapi.ExtenderFilterResult{
Nodes: &v1.NodeList{
Items: canSchedule,
},
FailedNodes: canNotSchedule,
Error: "",
}
return &result
}