orchard/internal/controller/scheduler.go

77 lines
1.2 KiB
Go

package controller
import (
storepkg "github.com/cirruslabs/orchard/internal/controller/store"
"github.com/cirruslabs/orchard/pkg/resource/v1"
"sort"
"time"
)
const schedulerInterval = 5 * time.Second
func runScheduler(store storepkg.Store) error {
ticker := time.NewTicker(schedulerInterval)
for {
if err := runSchedulerInner(store); err != nil {
return err
}
<-ticker.C
}
}
func runSchedulerInner(store storepkg.Store) error {
var vms []*v1.VM
var workers []*v1.Worker
var err error
err = store.View(func(txn storepkg.Transaction) error {
vms, err = txn.ListVMs()
if err != nil {
return err
}
workers, err = txn.ListWorkers()
if err != nil {
return err
}
return nil
})
if err != nil {
return err
}
// Sort VMs by date of creation
sort.Slice(vms, func(i, j int) bool {
return vms[i].CreatedAt.Before(vms[j].CreatedAt)
})
for _, vm := range vms {
vm := vm
if vm.Worker != "" {
continue
}
// Find an appropriate worker to run this VM on
for _, worker := range workers {
worker := worker
vm.Worker = worker.Name
err := store.Update(func(txn storepkg.Transaction) error {
return txn.SetVM(vm)
})
if err != nil {
return err
}
break
}
}
return nil
}