@@ -14,6 +14,7 @@ type CRIRuntimeConfig struct {
1414 // containerd. It is an opaque string (for example "runsc" or "runc");
1515 // SandboxFleet does not interpret runtime-specific values.
1616 // +kubebuilder:validation:MinLength=1
17+ // +kubebuilder:validation:MaxLength=253
1718 RuntimeHandler string `json:"runtimeHandler"`
1819}
1920
@@ -29,43 +30,54 @@ type RuntimeConfig struct {
2930// SlotProfile is a named, fixed resource specification for Slots.
3031type SlotProfile struct {
3132 // +kubebuilder:validation:MinLength=1
33+ // +kubebuilder:validation:MaxLength=63
3234 Name string `json:"name"`
3335
3436 // Resources is the per-Slot budget. Immutable after the Profile is created.
37+ // Resource changes are rejected by Worker ApplySlots for existing Slot IDs.
3538 Resources corev1.ResourceRequirements `json:"resources"`
3639}
3740
3841// SlotGroup declares how many Slots of one Profile each Worker of a Template has.
3942type SlotGroup struct {
4043 // +kubebuilder:validation:MinLength=1
44+ // +kubebuilder:validation:MaxLength=63
4145 Profile string `json:"profile"`
4246
4347 // +kubebuilder:validation:Minimum=1
48+ // +kubebuilder:validation:Maximum=256
4449 Count int32 `json:"count"`
4550}
4651
4752// WorkerTemplate defines a homogeneous set of Worker Pods and their Slot layout.
4853type WorkerTemplate struct {
4954 // +kubebuilder:validation:MinLength=1
55+ // +kubebuilder:validation:MaxLength=63
5056 Name string `json:"name"`
5157
5258 // +kubebuilder:validation:Minimum=0
59+ // +kubebuilder:validation:Maximum=1000
5360 Replicas int32 `json:"replicas"`
5461
5562 // +kubebuilder:validation:MinItems=1
63+ // +kubebuilder:validation:MaxItems=32
5664 Slots []SlotGroup `json:"slots"`
5765}
5866
67+ // Runtime and profile/template names are immutable. Profile resources are enforced
68+ // at apply time (existing Slot IDs cannot change resources).
5969// +kubebuilder:validation:XValidation:rule="self.runtime == oldSelf.runtime",message="runtime is immutable"
60- // +kubebuilder:validation:XValidation:rule="oldSelf.slotProfiles. all(o, self.slotProfiles.exists(p, p.name == o.name && p.resources == o.resources ))",message="slotProfile names and resources are immutable"
61- // +kubebuilder:validation:XValidation:rule="oldSelf.workerTemplates.all(o, self.workerTemplates.exists(t, t.name == o.name))",message="workerTemplate names are immutable"
70+ // +kubebuilder:validation:XValidation:rule="size(self.slotProfiles) == size( oldSelf.slotProfiles) && oldSelf.slotProfiles. all(o, self.slotProfiles.exists(p, p.name == o.name))",message="slotProfile names are immutable"
71+ // +kubebuilder:validation:XValidation:rule="size(self.workerTemplates) == size(oldSelf.workerTemplates) && oldSelf.workerTemplates.all(o, self.workerTemplates.exists(t, t.name == o.name))",message="workerTemplate names are immutable"
6272type SandboxPoolSpec struct {
6373 Runtime RuntimeConfig `json:"runtime"`
6474
6575 // +kubebuilder:validation:MinItems=1
76+ // +kubebuilder:validation:MaxItems=32
6677 SlotProfiles []SlotProfile `json:"slotProfiles"`
6778
6879 // +kubebuilder:validation:MinItems=1
80+ // +kubebuilder:validation:MaxItems=32
6981 WorkerTemplates []WorkerTemplate `json:"workerTemplates"`
7082}
7183
@@ -77,13 +89,15 @@ type WorkerTemplateStatus struct {
7789
7890 // AppliedSlots is the Slot layout currently applied for this Template's Workers.
7991 // +optional
92+ // +kubebuilder:validation:MaxItems=256
8093 AppliedSlots []AppliedSlot `json:"appliedSlots,omitempty"`
8194}
8295
8396// AppliedSlot is one Slot in a Template's applied topology.
8497type AppliedSlot struct {
8598 ID int32 `json:"id"`
8699 // +kubebuilder:validation:MinLength=1
100+ // +kubebuilder:validation:MaxLength=63
87101 Profile string `json:"profile"`
88102}
89103
0 commit comments