refactor: separate workload class from placement driver
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
package taskassignment
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"slices"
|
||||
)
|
||||
|
||||
type WorkloadClass string
|
||||
|
||||
const (
|
||||
WorkloadContainer WorkloadClass = "container"
|
||||
WorkloadVM WorkloadClass = "vm"
|
||||
)
|
||||
|
||||
type Driver string
|
||||
|
||||
const (
|
||||
DriverKubernetes Driver = "kubernetes"
|
||||
DriverOpenSandbox Driver = "opensandbox"
|
||||
)
|
||||
|
||||
type Placement struct {
|
||||
Class WorkloadClass `json:"workload_class"`
|
||||
Driver Driver `json:"driver"`
|
||||
}
|
||||
|
||||
var (
|
||||
KubernetesContainer = Placement{Class: WorkloadContainer, Driver: DriverKubernetes}
|
||||
OpenSandboxVM = Placement{Class: WorkloadVM, Driver: DriverOpenSandbox}
|
||||
)
|
||||
|
||||
func (p Placement) Validate() error {
|
||||
switch p {
|
||||
case KubernetesContainer, OpenSandboxVM:
|
||||
return nil
|
||||
default:
|
||||
return fmt.Errorf("unsupported workload placement %s/%s", p.Class, p.Driver)
|
||||
}
|
||||
}
|
||||
|
||||
func (p Placement) Key() string { return string(p.Class) + "." + string(p.Driver) }
|
||||
|
||||
func PlacementFromLabels(labels []string) (Placement, error) {
|
||||
if !slices.Contains(labels, "self-hosted") {
|
||||
return Placement{}, fmt.Errorf("task runs-on labels must include self-hosted: %v", labels)
|
||||
}
|
||||
legacyPod := slices.Contains(labels, "pod")
|
||||
container := slices.Contains(labels, string(WorkloadContainer))
|
||||
vm := slices.Contains(labels, string(WorkloadVM)) || slices.Contains(labels, "vm-dev")
|
||||
kubernetes := slices.Contains(labels, string(DriverKubernetes))
|
||||
opensandbox := slices.Contains(labels, string(DriverOpenSandbox))
|
||||
|
||||
if legacyPod {
|
||||
if container || vm || kubernetes || opensandbox {
|
||||
return Placement{}, errors.New("legacy pod label cannot be combined with workload or VM driver labels")
|
||||
}
|
||||
return KubernetesContainer, nil
|
||||
}
|
||||
if container == vm {
|
||||
return Placement{}, fmt.Errorf("task runs-on labels must select exactly one workload class: %v", labels)
|
||||
}
|
||||
if kubernetes && opensandbox {
|
||||
return Placement{}, fmt.Errorf("task runs-on labels select multiple drivers: %v", labels)
|
||||
}
|
||||
if container {
|
||||
if opensandbox {
|
||||
return Placement{}, fmt.Errorf("opensandbox does not support container workloads")
|
||||
}
|
||||
return KubernetesContainer, nil
|
||||
}
|
||||
if kubernetes {
|
||||
return Placement{}, fmt.Errorf("kubernetes does not support VM workloads")
|
||||
}
|
||||
return OpenSandboxVM, nil
|
||||
}
|
||||
Reference in New Issue
Block a user