/
scheduler.go
70 lines (57 loc) · 1.6 KB
/
scheduler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package schedulers
import (
"os"
"github.com/go-logr/logr"
"golang.org/x/net/context"
scheduler "k8s.io/kubernetes/cmd/kube-scheduler/app"
"sigs.k8s.io/controller-runtime/pkg/client"
logf "sigs.k8s.io/controller-runtime/pkg/log"
)
// log is for logging in this package
var schedulerLog = logf.Log.WithName("schedulers.Scheduler")
// Scheduler HTTP service for schedulers
type Scheduler struct {
client.Client
strict bool
logger logr.Logger
}
// Start starts request handling
func (s *Scheduler) Start(ctx context.Context) <-chan error {
s.logger.Info("Plugin start...")
errChan := make(chan error)
go func() {
defer s.logger.Info("Plugin stop")
defer close(errChan)
podSchedulerPlugin := podSCheduler{
Client: s.Client,
strict: s.strict,
logger: s.logger.WithName("Pod"),
}
command := scheduler.NewSchedulerCommand(scheduler.WithPlugin(podSchedulerPlugin.Name(), podSchedulerPlugin.Factory))
command.SetOut(&logWriter{s.logger})
command.SetErr(os.Stderr)
command.SetArgs([]string{"--config=/etc/kubernetes/discoblocks-scheduler/scheduler-config.yaml"})
if err := command.ExecuteContext(ctx); err != nil {
s.logger.Error(err, "Scheduler plugin crashed")
errChan <- err
return
}
}()
return errChan
}
// NewScheduler creates a new scheduler
func NewScheduler(kubeClient client.Client, strict bool) *Scheduler {
return &Scheduler{
Client: kubeClient,
strict: strict,
logger: schedulerLog,
}
}
type logWriter struct {
logr.Logger
}
// Write turns input to log message
func (w *logWriter) Write(p []byte) (int, error) {
w.Logger.Info(string(p))
return len(p), nil
}