Files

55 lines
1.5 KiB
Go

package scheduler
import (
"errors"
"github.com/psviderski/uncloud/internal/machine/api/pb"
"github.com/psviderski/uncloud/pkg/api"
)
type ServiceScheduler struct {
state *ClusterState
spec api.ServiceSpec
constraints []Constraint
}
// NewServiceScheduler creates a new ServiceScheduler with the given cluster state and service specification.
func NewServiceScheduler(state *ClusterState, spec api.ServiceSpec) *ServiceScheduler {
constraints := constraintsFromSpec(spec)
return &ServiceScheduler{
state: state,
spec: spec,
constraints: constraints,
}
}
// EligibleMachines returns a list of machines that satisfy all constraints for the next scheduled container.
func (s *ServiceScheduler) EligibleMachines() ([]*Machine, error) {
var available []*Machine
for _, machine := range s.state.Machines {
if s.evaluateConstraints(machine) {
available = append(available, machine)
}
}
if len(available) == 0 {
return nil, errors.New("no machines available that satisfy all constraints")
}
return available, nil
}
func (s *ServiceScheduler) evaluateConstraints(machine *Machine) bool {
for _, c := range s.constraints {
if !c.Evaluate(machine) {
return false
}
}
return true
}
func (s *ServiceScheduler) ScheduleContainer() ([]*pb.MachineInfo, error) {
// TODO: organise machines in a heap and supply a sort function from the strategy. Each scheduled container
// should update the machine and reorder it in the heap.
return nil, errors.New("not implemented")
}