Add DisruptionMode and PreemptionPolicy fields to the CompositePodGroup API

This commit is contained in:
Antoni Zawodny
2026-07-14 21:18:09 +02:00
parent 37e58561e3
commit 54f6446af1
54 changed files with 4843 additions and 529 deletions

View File

@@ -20010,6 +20010,10 @@
}
]
},
"io.k8s.api.scheduling.v1alpha3.AllCompositeDisruptionMode": {
"description": "AllCompositeDisruptionMode means that children of a CompositePodGroup can only be disrupted or preempted together.",
"type": "object"
},
"io.k8s.api.scheduling.v1alpha3.AllDisruptionMode": {
"description": "AllDisruptionMode specifies that children can only be disrupted together.",
"type": "object"
@@ -20022,6 +20026,28 @@
"description": "CompositeBasicSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled independently.",
"type": "object"
},
"io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode": {
"description": "CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted. Exactly one mode must be set.",
"properties": {
"all": {
"$ref": "#/definitions/io.k8s.api.scheduling.v1alpha3.AllCompositeDisruptionMode",
"description": "all specifies that all children groups can only be disrupted together."
},
"single": {
"$ref": "#/definitions/io.k8s.api.scheduling.v1alpha3.SingleCompositeDisruptionMode",
"description": "single specifies that children groups can be disrupted independently from each other."
}
},
"type": "object",
"x-kubernetes-unions": [
{
"fields-to-discriminateBy": {
"all": "All",
"single": "Single"
}
}
]
},
"io.k8s.api.scheduling.v1alpha3.CompositeGangSchedulingPolicy": {
"description": "CompositeGangSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled using all-or-nothing semantics.",
"properties": {
@@ -20146,10 +20172,18 @@
"io.k8s.api.scheduling.v1alpha3.CompositePodGroupSpec": {
"description": "CompositePodGroupSpec defines the desired state of CompositePodGroup.",
"properties": {
"disruptionMode": {
"$ref": "#/definitions/io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode",
"description": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. One of Single, All. Defaults to Single if unset. This field is immutable."
},
"parentCompositePodGroupName": {
"description": "parentCompositePodGroupName contains the name of the parent composite pod group within the same namespace as this composite pod group. It must be a DNS name. If it's nil, then this composite pod group is a root of a workload's hierarchy. This field is immutable.",
"type": "string"
},
"preemptionPolicy": {
"description": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. When Priority Admission Controller is enabled, it populates this field from PriorityClassName, and defaults to PreemptLowerPriority if value is unset in PriorityClass. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
"type": "string"
},
"priority": {
"description": "priority is the value of priority of this composite pod group. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"format": "int32",
@@ -20211,6 +20245,10 @@
],
"x-kubernetes-list-type": "map"
},
"disruptionMode": {
"$ref": "#/definitions/io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode",
"description": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. One of Single, All. This field is immutable."
},
"name": {
"description": "name is a unique identifier for the CompositePodGroupTemplate within the Workload. It must be a DNS label. This field is required.",
"type": "string"
@@ -20226,6 +20264,10 @@
],
"x-kubernetes-list-type": "map"
},
"preemptionPolicy": {
"description": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
"type": "string"
},
"priority": {
"description": "priority is the value of priority of composite pod groups created from this template. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"format": "int32",
@@ -20570,6 +20612,10 @@
],
"type": "object"
},
"io.k8s.api.scheduling.v1alpha3.SingleCompositeDisruptionMode": {
"description": "SingleCompositeDisruptionMode means that individual children of a CompositePodGroup can be disrupted or preempted independently.",
"type": "object"
},
"io.k8s.api.scheduling.v1alpha3.SingleDisruptionMode": {
"description": "SingleDisruptionMode specifies that children can be disrupted independently.",
"type": "object"
@@ -20828,6 +20874,10 @@
},
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.AllCompositeDisruptionMode": {
"description": "AllCompositeDisruptionMode means that children of a CompositePodGroup can only be disrupted or preempted together.",
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.AllDisruptionMode": {
"description": "AllDisruptionMode specifies that children can only be disrupted together.",
"type": "object"
@@ -20840,6 +20890,28 @@
"description": "CompositeBasicSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled independently.",
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.CompositeDisruptionMode": {
"description": "CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted. Exactly one mode must be set.",
"properties": {
"all": {
"$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.AllCompositeDisruptionMode",
"description": "all specifies that all children groups can only be disrupted together."
},
"single": {
"$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.SingleCompositeDisruptionMode",
"description": "single specifies that children groups can be disrupted independently from each other."
}
},
"type": "object",
"x-kubernetes-unions": [
{
"fields-to-discriminateBy": {
"all": "All",
"single": "Single"
}
}
]
},
"io.k8s.api.scheduling.v1beta1.CompositeGangSchedulingPolicy": {
"description": "CompositeGangSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled using all-or-nothing semantics.",
"properties": {
@@ -20904,6 +20976,10 @@
],
"x-kubernetes-list-type": "map"
},
"disruptionMode": {
"$ref": "#/definitions/io.k8s.api.scheduling.v1beta1.CompositeDisruptionMode",
"description": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. One of Single, All. This field is immutable."
},
"name": {
"description": "name is a unique identifier for the CompositePodGroupTemplate within the Workload. It must be a DNS label. This field is required.",
"type": "string"
@@ -20919,6 +20995,10 @@
],
"x-kubernetes-list-type": "map"
},
"preemptionPolicy": {
"description": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
"type": "string"
},
"priority": {
"description": "priority is the value of priority of composite pod groups created from this template. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"format": "int32",
@@ -21263,6 +21343,10 @@
],
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.SingleCompositeDisruptionMode": {
"description": "SingleCompositeDisruptionMode means that individual children of a CompositePodGroup can be disrupted or preempted independently.",
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.SingleDisruptionMode": {
"description": "SingleDisruptionMode specifies that children can be disrupted independently.",
"type": "object"

View File

@@ -1,6 +1,10 @@
{
"components": {
"schemas": {
"io.k8s.api.scheduling.v1alpha3.AllCompositeDisruptionMode": {
"description": "AllCompositeDisruptionMode means that children of a CompositePodGroup can only be disrupted or preempted together.",
"type": "object"
},
"io.k8s.api.scheduling.v1alpha3.AllDisruptionMode": {
"description": "AllDisruptionMode specifies that children can only be disrupted together.",
"type": "object"
@@ -13,6 +17,36 @@
"description": "CompositeBasicSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled independently.",
"type": "object"
},
"io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode": {
"description": "CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted. Exactly one mode must be set.",
"properties": {
"all": {
"allOf": [
{
"$ref": "#/components/schemas/io.k8s.api.scheduling.v1alpha3.AllCompositeDisruptionMode"
}
],
"description": "all specifies that all children groups can only be disrupted together."
},
"single": {
"allOf": [
{
"$ref": "#/components/schemas/io.k8s.api.scheduling.v1alpha3.SingleCompositeDisruptionMode"
}
],
"description": "single specifies that children groups can be disrupted independently from each other."
}
},
"type": "object",
"x-kubernetes-unions": [
{
"fields-to-discriminateBy": {
"all": "All",
"single": "Single"
}
}
]
},
"io.k8s.api.scheduling.v1alpha3.CompositeGangSchedulingPolicy": {
"description": "CompositeGangSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled using all-or-nothing semantics.",
"properties": {
@@ -166,10 +200,25 @@
"io.k8s.api.scheduling.v1alpha3.CompositePodGroupSpec": {
"description": "CompositePodGroupSpec defines the desired state of CompositePodGroup.",
"properties": {
"disruptionMode": {
"allOf": [
{
"$ref": "#/components/schemas/io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode"
}
],
"default": {
"single": {}
},
"description": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. One of Single, All. Defaults to Single if unset. This field is immutable."
},
"parentCompositePodGroupName": {
"description": "parentCompositePodGroupName contains the name of the parent composite pod group within the same namespace as this composite pod group. It must be a DNS name. If it's nil, then this composite pod group is a root of a workload's hierarchy. This field is immutable.",
"type": "string"
},
"preemptionPolicy": {
"description": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. When Priority Admission Controller is enabled, it populates this field from PriorityClassName, and defaults to PreemptLowerPriority if value is unset in PriorityClass. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
"type": "string"
},
"priority": {
"description": "priority is the value of priority of this composite pod group. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"format": "int32",
@@ -244,6 +293,14 @@
],
"x-kubernetes-list-type": "map"
},
"disruptionMode": {
"allOf": [
{
"$ref": "#/components/schemas/io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode"
}
],
"description": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. One of Single, All. This field is immutable."
},
"name": {
"default": "",
"description": "name is a unique identifier for the CompositePodGroupTemplate within the Workload. It must be a DNS label. This field is required.",
@@ -260,6 +317,10 @@
],
"x-kubernetes-list-type": "map"
},
"preemptionPolicy": {
"description": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
"type": "string"
},
"priority": {
"description": "priority is the value of priority of composite pod groups created from this template. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"format": "int32",
@@ -686,6 +747,10 @@
],
"type": "object"
},
"io.k8s.api.scheduling.v1alpha3.SingleCompositeDisruptionMode": {
"description": "SingleCompositeDisruptionMode means that individual children of a CompositePodGroup can be disrupted or preempted independently.",
"type": "object"
},
"io.k8s.api.scheduling.v1alpha3.SingleDisruptionMode": {
"description": "SingleDisruptionMode specifies that children can be disrupted independently.",
"type": "object"

View File

@@ -1,6 +1,10 @@
{
"components": {
"schemas": {
"io.k8s.api.scheduling.v1beta1.AllCompositeDisruptionMode": {
"description": "AllCompositeDisruptionMode means that children of a CompositePodGroup can only be disrupted or preempted together.",
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.AllDisruptionMode": {
"description": "AllDisruptionMode specifies that children can only be disrupted together.",
"type": "object"
@@ -13,6 +17,36 @@
"description": "CompositeBasicSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled independently.",
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.CompositeDisruptionMode": {
"description": "CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted. Exactly one mode must be set.",
"properties": {
"all": {
"allOf": [
{
"$ref": "#/components/schemas/io.k8s.api.scheduling.v1beta1.AllCompositeDisruptionMode"
}
],
"description": "all specifies that all children groups can only be disrupted together."
},
"single": {
"allOf": [
{
"$ref": "#/components/schemas/io.k8s.api.scheduling.v1beta1.SingleCompositeDisruptionMode"
}
],
"description": "single specifies that children groups can be disrupted independently from each other."
}
},
"type": "object",
"x-kubernetes-unions": [
{
"fields-to-discriminateBy": {
"all": "All",
"single": "Single"
}
}
]
},
"io.k8s.api.scheduling.v1beta1.CompositeGangSchedulingPolicy": {
"description": "CompositeGangSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled using all-or-nothing semantics.",
"properties": {
@@ -86,6 +120,14 @@
],
"x-kubernetes-list-type": "map"
},
"disruptionMode": {
"allOf": [
{
"$ref": "#/components/schemas/io.k8s.api.scheduling.v1beta1.CompositeDisruptionMode"
}
],
"description": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. One of Single, All. This field is immutable."
},
"name": {
"default": "",
"description": "name is a unique identifier for the CompositePodGroupTemplate within the Workload. It must be a DNS label. This field is required.",
@@ -102,6 +144,10 @@
],
"x-kubernetes-list-type": "map"
},
"preemptionPolicy": {
"description": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
"type": "string"
},
"priority": {
"description": "priority is the value of priority of composite pod groups created from this template. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"format": "int32",
@@ -528,6 +574,10 @@
],
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.SingleCompositeDisruptionMode": {
"description": "SingleCompositeDisruptionMode means that individual children of a CompositePodGroup can be disrupted or preempted independently.",
"type": "object"
},
"io.k8s.api.scheduling.v1beta1.SingleDisruptionMode": {
"description": "SingleDisruptionMode specifies that children can be disrupted independently.",
"type": "object"

View File

@@ -227,6 +227,8 @@ func TestDefaulting(t *testing.T) {
{Group: "scheduling.k8s.io", Version: "v1alpha3", Kind: "PodGroupList"}: {},
{Group: "scheduling.k8s.io", Version: "v1beta1", Kind: "PodGroup"}: {},
{Group: "scheduling.k8s.io", Version: "v1beta1", Kind: "PodGroupList"}: {},
{Group: "scheduling.k8s.io", Version: "v1alpha3", Kind: "CompositePodGroup"}: {},
{Group: "scheduling.k8s.io", Version: "v1alpha3", Kind: "CompositePodGroupList"}: {},
{Group: "scheduling.k8s.io", Version: "v1beta1", Kind: "PriorityClass"}: {},
{Group: "scheduling.k8s.io", Version: "v1", Kind: "PriorityClass"}: {},
{Group: "scheduling.k8s.io", Version: "v1beta1", Kind: "PriorityClassList"}: {},

View File

@@ -43,5 +43,15 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} {
s.Spec.PreemptionPolicy = &preemptLowerPriority
}
},
func(s *scheduling.CompositePodGroup, c randfill.Continue) {
c.FillNoCustom(s)
if s.Spec.DisruptionMode == nil {
s.Spec.DisruptionMode = &scheduling.CompositeDisruptionMode{Single: &scheduling.SingleCompositeDisruptionMode{}}
}
if s.Spec.PreemptionPolicy == nil {
preemptLowerPriority := scheduling.PreemptLowerPriority
s.Spec.PreemptionPolicy = &preemptLowerPriority
}
},
}
}

View File

@@ -288,6 +288,19 @@ type CompositePodGroupTemplate struct {
// +required
SchedulingPolicy CompositePodGroupSchedulingPolicy
// SchedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
SchedulingConstraints *CompositePodGroupSchedulingConstraints
// DisruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// One of Single, All.
// This field is immutable.
//
// +optional
DisruptionMode *CompositeDisruptionMode
// PriorityClassName indicates the priority that should be considered when scheduling
// a composite pod group created from this template. If no priority class is specified,
// admission control can set this to the global default priority class if it exists.
@@ -308,6 +321,15 @@ type CompositePodGroupTemplate struct {
// +optional
Priority *int32
// PreemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
//
// +featureGate=PodGroupPreemptionPolicy
// +optional
PreemptionPolicy *PreemptionPolicy
// PodGroupTemplates is the list of templates for children PodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
// or PodGroupTemplates must be set.
@@ -325,12 +347,6 @@ type CompositePodGroupTemplate struct {
// +listType=map
// +listMapKey=name
CompositePodGroupTemplates []CompositePodGroupTemplate
// SchedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
SchedulingConstraints *CompositePodGroupSchedulingConstraints
}
// PodGroupSchedulingPolicy defines the scheduling configuration for a PodGroup.
@@ -771,6 +787,21 @@ type CompositePodGroupSpec struct {
// +required
SchedulingPolicy CompositePodGroupSchedulingPolicy
// SchedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
SchedulingConstraints *CompositePodGroupSchedulingConstraints
// DisruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// One of Single, All. Defaults to Single if unset.
// This field is immutable.
//
// +optional
DisruptionMode *CompositeDisruptionMode
// PriorityClassName defines the priority that should be considered when scheduling this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// If left unspecified, it is validated and resolved similarly to the PriorityClassName field in Pods
@@ -791,12 +822,16 @@ type CompositePodGroupSpec struct {
// +optional
Priority *int32
// SchedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// PreemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset.
// When Priority Admission Controller is enabled, it populates this field from PriorityClassName,
// and defaults to PreemptLowerPriority if value is unset in PriorityClass.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
//
// +featureGate=PodGroupPreemptionPolicy
// +optional
SchedulingConstraints *CompositePodGroupSchedulingConstraints
PreemptionPolicy *PreemptionPolicy
}
// CompositePodGroupSchedulingPolicy defines the scheduling configuration for a CompositePodGroup.
@@ -837,6 +872,34 @@ type CompositeGangSchedulingPolicy struct {
MinGroupCount int32
}
// CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted.
// Exactly one mode must be set.
//
// +union
type CompositeDisruptionMode struct {
// Single specifies that children groups can be disrupted independently from each other.
//
// +optional
Single *SingleCompositeDisruptionMode
// All specifies that all children groups can only be disrupted together.
//
// +optional
All *AllCompositeDisruptionMode
}
// SingleCompositeDisruptionMode means that individual children of a CompositePodGroup
// can be disrupted or preempted independently.
type SingleCompositeDisruptionMode struct {
// This is intentionally empty.
}
// AllCompositeDisruptionMode means that children of a CompositePodGroup can only be
// disrupted or preempted together.
type AllCompositeDisruptionMode struct {
// This is intentionally empty.
}
// CompositePodGroupStatus represents information about the status of a composite pod group.
type CompositePodGroupStatus struct {
// Conditions represent the latest observations of the CompositePodGroup's state.

View File

@@ -35,3 +35,12 @@ func SetDefaults_PodGroup(in *schedulingv1alpha3.PodGroup) {
}
}
}
func SetDefaults_CompositePodGroup(in *schedulingv1alpha3.CompositePodGroup) {
if utilfeature.DefaultFeatureGate.Enabled(features.PodGroupPreemptionPolicy) {
if in.Spec.PreemptionPolicy == nil {
preemptLowerPriority := schedulingv1alpha3.PreemptLowerPriority
in.Spec.PreemptionPolicy = &preemptLowerPriority
}
}
}

View File

@@ -37,6 +37,16 @@ func init() {
// RegisterConversions adds conversion functions to the given scheme.
// Public to allow building arbitrary schemes.
func RegisterConversions(s *runtime.Scheme) error {
if err := s.AddGeneratedConversionFunc((*schedulingv1alpha3.AllCompositeDisruptionMode)(nil), (*scheduling.AllCompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode(a.(*schedulingv1alpha3.AllCompositeDisruptionMode), b.(*scheduling.AllCompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*scheduling.AllCompositeDisruptionMode)(nil), (*schedulingv1alpha3.AllCompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_scheduling_AllCompositeDisruptionMode_To_v1alpha3_AllCompositeDisruptionMode(a.(*scheduling.AllCompositeDisruptionMode), b.(*schedulingv1alpha3.AllCompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1alpha3.AllDisruptionMode)(nil), (*scheduling.AllDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_AllDisruptionMode_To_scheduling_AllDisruptionMode(a.(*schedulingv1alpha3.AllDisruptionMode), b.(*scheduling.AllDisruptionMode), scope)
}); err != nil {
@@ -67,6 +77,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1alpha3.CompositeDisruptionMode)(nil), (*scheduling.CompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode(a.(*schedulingv1alpha3.CompositeDisruptionMode), b.(*scheduling.CompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*scheduling.CompositeDisruptionMode)(nil), (*schedulingv1alpha3.CompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_scheduling_CompositeDisruptionMode_To_v1alpha3_CompositeDisruptionMode(a.(*scheduling.CompositeDisruptionMode), b.(*schedulingv1alpha3.CompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1alpha3.CompositeGangSchedulingPolicy)(nil), (*scheduling.CompositeGangSchedulingPolicy)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_CompositeGangSchedulingPolicy_To_scheduling_CompositeGangSchedulingPolicy(a.(*schedulingv1alpha3.CompositeGangSchedulingPolicy), b.(*scheduling.CompositeGangSchedulingPolicy), scope)
}); err != nil {
@@ -257,6 +277,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1alpha3.SingleCompositeDisruptionMode)(nil), (*scheduling.SingleCompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode(a.(*schedulingv1alpha3.SingleCompositeDisruptionMode), b.(*scheduling.SingleCompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*scheduling.SingleCompositeDisruptionMode)(nil), (*schedulingv1alpha3.SingleCompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_scheduling_SingleCompositeDisruptionMode_To_v1alpha3_SingleCompositeDisruptionMode(a.(*scheduling.SingleCompositeDisruptionMode), b.(*schedulingv1alpha3.SingleCompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1alpha3.SingleDisruptionMode)(nil), (*scheduling.SingleDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1alpha3_SingleDisruptionMode_To_scheduling_SingleDisruptionMode(a.(*schedulingv1alpha3.SingleDisruptionMode), b.(*scheduling.SingleDisruptionMode), scope)
}); err != nil {
@@ -330,6 +360,26 @@ func RegisterConversions(s *runtime.Scheme) error {
return nil
}
func autoConvert_v1alpha3_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode(in *schedulingv1alpha3.AllCompositeDisruptionMode, out *scheduling.AllCompositeDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.AllCompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_v1alpha3_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode is an autogenerated conversion function.
func Convert_v1alpha3_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode(in *schedulingv1alpha3.AllCompositeDisruptionMode, out *scheduling.AllCompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_v1alpha3_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode(in, out, s)
}
func autoConvert_scheduling_AllCompositeDisruptionMode_To_v1alpha3_AllCompositeDisruptionMode(in *scheduling.AllCompositeDisruptionMode, out *schedulingv1alpha3.AllCompositeDisruptionMode, s conversion.Scope) error {
*out = *(*schedulingv1alpha3.AllCompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_scheduling_AllCompositeDisruptionMode_To_v1alpha3_AllCompositeDisruptionMode is an autogenerated conversion function.
func Convert_scheduling_AllCompositeDisruptionMode_To_v1alpha3_AllCompositeDisruptionMode(in *scheduling.AllCompositeDisruptionMode, out *schedulingv1alpha3.AllCompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_scheduling_AllCompositeDisruptionMode_To_v1alpha3_AllCompositeDisruptionMode(in, out, s)
}
func autoConvert_v1alpha3_AllDisruptionMode_To_scheduling_AllDisruptionMode(in *schedulingv1alpha3.AllDisruptionMode, out *scheduling.AllDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.AllDisruptionMode)(unsafe.Pointer(in))
return nil
@@ -390,6 +440,26 @@ func Convert_scheduling_CompositeBasicSchedulingPolicy_To_v1alpha3_CompositeBasi
return autoConvert_scheduling_CompositeBasicSchedulingPolicy_To_v1alpha3_CompositeBasicSchedulingPolicy(in, out, s)
}
func autoConvert_v1alpha3_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode(in *schedulingv1alpha3.CompositeDisruptionMode, out *scheduling.CompositeDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.CompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_v1alpha3_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode is an autogenerated conversion function.
func Convert_v1alpha3_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode(in *schedulingv1alpha3.CompositeDisruptionMode, out *scheduling.CompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_v1alpha3_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode(in, out, s)
}
func autoConvert_scheduling_CompositeDisruptionMode_To_v1alpha3_CompositeDisruptionMode(in *scheduling.CompositeDisruptionMode, out *schedulingv1alpha3.CompositeDisruptionMode, s conversion.Scope) error {
*out = *(*schedulingv1alpha3.CompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_scheduling_CompositeDisruptionMode_To_v1alpha3_CompositeDisruptionMode is an autogenerated conversion function.
func Convert_scheduling_CompositeDisruptionMode_To_v1alpha3_CompositeDisruptionMode(in *scheduling.CompositeDisruptionMode, out *schedulingv1alpha3.CompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_scheduling_CompositeDisruptionMode_To_v1alpha3_CompositeDisruptionMode(in, out, s)
}
func autoConvert_v1alpha3_CompositeGangSchedulingPolicy_To_scheduling_CompositeGangSchedulingPolicy(in *schedulingv1alpha3.CompositeGangSchedulingPolicy, out *scheduling.CompositeGangSchedulingPolicy, s conversion.Scope) error {
*out = *(*scheduling.CompositeGangSchedulingPolicy)(unsafe.Pointer(in))
return nil
@@ -798,6 +868,26 @@ func Convert_scheduling_PodGroupTemplate_To_v1alpha3_PodGroupTemplate(in *schedu
return autoConvert_scheduling_PodGroupTemplate_To_v1alpha3_PodGroupTemplate(in, out, s)
}
func autoConvert_v1alpha3_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode(in *schedulingv1alpha3.SingleCompositeDisruptionMode, out *scheduling.SingleCompositeDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.SingleCompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_v1alpha3_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode is an autogenerated conversion function.
func Convert_v1alpha3_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode(in *schedulingv1alpha3.SingleCompositeDisruptionMode, out *scheduling.SingleCompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_v1alpha3_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode(in, out, s)
}
func autoConvert_scheduling_SingleCompositeDisruptionMode_To_v1alpha3_SingleCompositeDisruptionMode(in *scheduling.SingleCompositeDisruptionMode, out *schedulingv1alpha3.SingleCompositeDisruptionMode, s conversion.Scope) error {
*out = *(*schedulingv1alpha3.SingleCompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_scheduling_SingleCompositeDisruptionMode_To_v1alpha3_SingleCompositeDisruptionMode is an autogenerated conversion function.
func Convert_scheduling_SingleCompositeDisruptionMode_To_v1alpha3_SingleCompositeDisruptionMode(in *scheduling.SingleCompositeDisruptionMode, out *schedulingv1alpha3.SingleCompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_scheduling_SingleCompositeDisruptionMode_To_v1alpha3_SingleCompositeDisruptionMode(in, out, s)
}
func autoConvert_v1alpha3_SingleDisruptionMode_To_scheduling_SingleDisruptionMode(in *schedulingv1alpha3.SingleDisruptionMode, out *scheduling.SingleDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.SingleDisruptionMode)(unsafe.Pointer(in))
return nil

View File

@@ -32,11 +32,33 @@ import (
// Public to allow building arbitrary schemes.
// All generated defaulters are covering - they call all nested defaulters.
func RegisterDefaults(scheme *runtime.Scheme) error {
scheme.AddTypeDefaultingFunc(&schedulingv1alpha3.CompositePodGroup{}, func(obj interface{}) {
SetObjectDefaults_CompositePodGroup(obj.(*schedulingv1alpha3.CompositePodGroup))
})
scheme.AddTypeDefaultingFunc(&schedulingv1alpha3.CompositePodGroupList{}, func(obj interface{}) {
SetObjectDefaults_CompositePodGroupList(obj.(*schedulingv1alpha3.CompositePodGroupList))
})
scheme.AddTypeDefaultingFunc(&schedulingv1alpha3.PodGroup{}, func(obj interface{}) { SetObjectDefaults_PodGroup(obj.(*schedulingv1alpha3.PodGroup)) })
scheme.AddTypeDefaultingFunc(&schedulingv1alpha3.PodGroupList{}, func(obj interface{}) { SetObjectDefaults_PodGroupList(obj.(*schedulingv1alpha3.PodGroupList)) })
return nil
}
func SetObjectDefaults_CompositePodGroup(in *schedulingv1alpha3.CompositePodGroup) {
SetDefaults_CompositePodGroup(in)
if in.Spec.DisruptionMode == nil {
if err := json.Unmarshal([]byte(`{"single": {}}`), &in.Spec.DisruptionMode); err != nil {
panic(err)
}
}
}
func SetObjectDefaults_CompositePodGroupList(in *schedulingv1alpha3.CompositePodGroupList) {
for i := range in.Items {
a := &in.Items[i]
SetObjectDefaults_CompositePodGroup(a)
}
}
func SetObjectDefaults_PodGroup(in *schedulingv1alpha3.PodGroup) {
SetDefaults_PodGroup(in)
if in.Spec.DisruptionMode == nil {

View File

@@ -90,6 +90,89 @@ func RegisterValidations(scheme *runtime.Scheme) error {
return nil
}
var unionMembershipFor_k8s_io_api_scheduling_v1alpha3_CompositeDisruptionMode_ = validate.NewUnionMembership(validate.NewUnionMember("single"), validate.NewUnionMember("all"))
// Validate_CompositeDisruptionMode validates an instance of CompositeDisruptionMode according
// to declarative validation rules in the API schema.
func Validate_CompositeDisruptionMode(
ctx context.Context, op operation.Operation, fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.CompositeDisruptionMode) (errs field.ErrorList) {
if e := validate.Union(ctx, op, fldPath, obj, oldObj, unionMembershipFor_k8s_io_api_scheduling_v1alpha3_CompositeDisruptionMode_,
func(obj *schedulingv1alpha3.CompositeDisruptionMode) bool {
if obj == nil {
return false
}
return obj.Single != nil
},
func(obj *schedulingv1alpha3.CompositeDisruptionMode) bool {
if obj == nil {
return false
}
return obj.All != nil
}); len(e) != 0 {
errs = append(errs, e...)
}
{ // field schedulingv1alpha3.CompositeDisruptionMode.Single
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.SingleCompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositeDisruptionMode) *schedulingv1alpha3.SingleCompositeDisruptionMode {
return oldObj.Single
})
errs = append(errs, fn(fldPath.Child("single"), obj.Single, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositeDisruptionMode.All
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.AllCompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositeDisruptionMode) *schedulingv1alpha3.AllCompositeDisruptionMode {
return oldObj.All
})
errs = append(errs, fn(fldPath.Child("all"), obj.All, oldVal, oldObj != nil)...)
}
return errs
}
// Validate_CompositeGangSchedulingPolicy validates an instance of CompositeGangSchedulingPolicy according
// to declarative validation rules in the API schema.
func Validate_CompositeGangSchedulingPolicy(
@@ -453,6 +536,76 @@ func Validate_CompositePodGroupSpec(
errs = append(errs, fn(fldPath.Child("schedulingPolicy"), &obj.SchedulingPolicy, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupSpec.SchedulingConstraints
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.CompositePodGroupSchedulingConstraints,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositePodGroupSpec) *schedulingv1alpha3.CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupSpec.DisruptionMode
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.CompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
// optional fields with default values are effectively required
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositeDisruptionMode(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositePodGroupSpec) *schedulingv1alpha3.CompositeDisruptionMode {
return oldObj.DisruptionMode
})
errs = append(errs, fn(fldPath.Child("disruptionMode"), obj.DisruptionMode, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupSpec.PriorityClassName
fn := func(
fldPath *field.Path,
@@ -523,38 +676,45 @@ func Validate_CompositePodGroupSpec(
errs = append(errs, fn(fldPath.Child("priority"), obj.Priority, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupSpec.SchedulingConstraints
{ // field schedulingv1alpha3.CompositePodGroupSpec.PreemptionPolicy
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.CompositePodGroupSchedulingConstraints,
obj, oldObj *schedulingv1alpha3.PreemptionPolicy,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.ForbiddenPointer).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", true, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
errs = append(errs, Validate_PreemptionPolicy(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositePodGroupSpec) *schedulingv1alpha3.CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
func(oldObj *schedulingv1alpha3.CompositePodGroupSpec) *schedulingv1alpha3.PreemptionPolicy {
return oldObj.PreemptionPolicy
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
errs = append(errs, fn(fldPath.Child("preemptionPolicy"), obj.PreemptionPolicy, oldVal, oldObj != nil)...)
}
return errs
@@ -667,6 +827,74 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("schedulingPolicy"), &obj.SchedulingPolicy, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupTemplate.SchedulingConstraints
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.CompositePodGroupSchedulingConstraints,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositePodGroupTemplate) *schedulingv1alpha3.CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupTemplate.DisruptionMode
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.CompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositeDisruptionMode(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositePodGroupTemplate) *schedulingv1alpha3.CompositeDisruptionMode {
return oldObj.DisruptionMode
})
errs = append(errs, fn(fldPath.Child("disruptionMode"), obj.DisruptionMode, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupTemplate.PriorityClassName
fn := func(
fldPath *field.Path,
@@ -737,6 +965,47 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("priority"), obj.Priority, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupTemplate.PreemptionPolicy
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.PreemptionPolicy,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.ForbiddenPointer).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", true, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_PreemptionPolicy(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositePodGroupTemplate) *schedulingv1alpha3.PreemptionPolicy {
return oldObj.PreemptionPolicy
})
errs = append(errs, fn(fldPath.Child("preemptionPolicy"), obj.PreemptionPolicy, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupTemplate.PodGroupTemplates
fn := func(
fldPath *field.Path,
@@ -843,40 +1112,6 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("compositePodGroupTemplates"), obj.CompositePodGroupTemplates, oldVal, oldObj != nil)...)
}
{ // field schedulingv1alpha3.CompositePodGroupTemplate.SchedulingConstraints
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1alpha3.CompositePodGroupSchedulingConstraints,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1alpha3.CompositePodGroupTemplate) *schedulingv1alpha3.CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
}
return errs
}

View File

@@ -39,6 +39,16 @@ func init() {
// RegisterConversions adds conversion functions to the given scheme.
// Public to allow building arbitrary schemes.
func RegisterConversions(s *runtime.Scheme) error {
if err := s.AddGeneratedConversionFunc((*schedulingv1beta1.AllCompositeDisruptionMode)(nil), (*scheduling.AllCompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode(a.(*schedulingv1beta1.AllCompositeDisruptionMode), b.(*scheduling.AllCompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*scheduling.AllCompositeDisruptionMode)(nil), (*schedulingv1beta1.AllCompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_scheduling_AllCompositeDisruptionMode_To_v1beta1_AllCompositeDisruptionMode(a.(*scheduling.AllCompositeDisruptionMode), b.(*schedulingv1beta1.AllCompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1beta1.AllDisruptionMode)(nil), (*scheduling.AllDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_AllDisruptionMode_To_scheduling_AllDisruptionMode(a.(*schedulingv1beta1.AllDisruptionMode), b.(*scheduling.AllDisruptionMode), scope)
}); err != nil {
@@ -69,6 +79,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1beta1.CompositeDisruptionMode)(nil), (*scheduling.CompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode(a.(*schedulingv1beta1.CompositeDisruptionMode), b.(*scheduling.CompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*scheduling.CompositeDisruptionMode)(nil), (*schedulingv1beta1.CompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_scheduling_CompositeDisruptionMode_To_v1beta1_CompositeDisruptionMode(a.(*scheduling.CompositeDisruptionMode), b.(*schedulingv1beta1.CompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1beta1.CompositeGangSchedulingPolicy)(nil), (*scheduling.CompositeGangSchedulingPolicy)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_CompositeGangSchedulingPolicy_To_scheduling_CompositeGangSchedulingPolicy(a.(*schedulingv1beta1.CompositeGangSchedulingPolicy), b.(*scheduling.CompositeGangSchedulingPolicy), scope)
}); err != nil {
@@ -239,6 +259,16 @@ func RegisterConversions(s *runtime.Scheme) error {
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1beta1.SingleCompositeDisruptionMode)(nil), (*scheduling.SingleCompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode(a.(*schedulingv1beta1.SingleCompositeDisruptionMode), b.(*scheduling.SingleCompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*scheduling.SingleCompositeDisruptionMode)(nil), (*schedulingv1beta1.SingleCompositeDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_scheduling_SingleCompositeDisruptionMode_To_v1beta1_SingleCompositeDisruptionMode(a.(*scheduling.SingleCompositeDisruptionMode), b.(*schedulingv1beta1.SingleCompositeDisruptionMode), scope)
}); err != nil {
return err
}
if err := s.AddGeneratedConversionFunc((*schedulingv1beta1.SingleDisruptionMode)(nil), (*scheduling.SingleDisruptionMode)(nil), func(a, b interface{}, scope conversion.Scope) error {
return Convert_v1beta1_SingleDisruptionMode_To_scheduling_SingleDisruptionMode(a.(*schedulingv1beta1.SingleDisruptionMode), b.(*scheduling.SingleDisruptionMode), scope)
}); err != nil {
@@ -312,6 +342,26 @@ func RegisterConversions(s *runtime.Scheme) error {
return nil
}
func autoConvert_v1beta1_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode(in *schedulingv1beta1.AllCompositeDisruptionMode, out *scheduling.AllCompositeDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.AllCompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_v1beta1_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode is an autogenerated conversion function.
func Convert_v1beta1_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode(in *schedulingv1beta1.AllCompositeDisruptionMode, out *scheduling.AllCompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_v1beta1_AllCompositeDisruptionMode_To_scheduling_AllCompositeDisruptionMode(in, out, s)
}
func autoConvert_scheduling_AllCompositeDisruptionMode_To_v1beta1_AllCompositeDisruptionMode(in *scheduling.AllCompositeDisruptionMode, out *schedulingv1beta1.AllCompositeDisruptionMode, s conversion.Scope) error {
*out = *(*schedulingv1beta1.AllCompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_scheduling_AllCompositeDisruptionMode_To_v1beta1_AllCompositeDisruptionMode is an autogenerated conversion function.
func Convert_scheduling_AllCompositeDisruptionMode_To_v1beta1_AllCompositeDisruptionMode(in *scheduling.AllCompositeDisruptionMode, out *schedulingv1beta1.AllCompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_scheduling_AllCompositeDisruptionMode_To_v1beta1_AllCompositeDisruptionMode(in, out, s)
}
func autoConvert_v1beta1_AllDisruptionMode_To_scheduling_AllDisruptionMode(in *schedulingv1beta1.AllDisruptionMode, out *scheduling.AllDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.AllDisruptionMode)(unsafe.Pointer(in))
return nil
@@ -372,6 +422,26 @@ func Convert_scheduling_CompositeBasicSchedulingPolicy_To_v1beta1_CompositeBasic
return autoConvert_scheduling_CompositeBasicSchedulingPolicy_To_v1beta1_CompositeBasicSchedulingPolicy(in, out, s)
}
func autoConvert_v1beta1_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode(in *schedulingv1beta1.CompositeDisruptionMode, out *scheduling.CompositeDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.CompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_v1beta1_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode is an autogenerated conversion function.
func Convert_v1beta1_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode(in *schedulingv1beta1.CompositeDisruptionMode, out *scheduling.CompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_v1beta1_CompositeDisruptionMode_To_scheduling_CompositeDisruptionMode(in, out, s)
}
func autoConvert_scheduling_CompositeDisruptionMode_To_v1beta1_CompositeDisruptionMode(in *scheduling.CompositeDisruptionMode, out *schedulingv1beta1.CompositeDisruptionMode, s conversion.Scope) error {
*out = *(*schedulingv1beta1.CompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_scheduling_CompositeDisruptionMode_To_v1beta1_CompositeDisruptionMode is an autogenerated conversion function.
func Convert_scheduling_CompositeDisruptionMode_To_v1beta1_CompositeDisruptionMode(in *scheduling.CompositeDisruptionMode, out *schedulingv1beta1.CompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_scheduling_CompositeDisruptionMode_To_v1beta1_CompositeDisruptionMode(in, out, s)
}
func autoConvert_v1beta1_CompositeGangSchedulingPolicy_To_scheduling_CompositeGangSchedulingPolicy(in *schedulingv1beta1.CompositeGangSchedulingPolicy, out *scheduling.CompositeGangSchedulingPolicy, s conversion.Scope) error {
*out = *(*scheduling.CompositeGangSchedulingPolicy)(unsafe.Pointer(in))
return nil
@@ -736,6 +806,26 @@ func Convert_scheduling_PriorityClassList_To_v1beta1_PriorityClassList(in *sched
return autoConvert_scheduling_PriorityClassList_To_v1beta1_PriorityClassList(in, out, s)
}
func autoConvert_v1beta1_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode(in *schedulingv1beta1.SingleCompositeDisruptionMode, out *scheduling.SingleCompositeDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.SingleCompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_v1beta1_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode is an autogenerated conversion function.
func Convert_v1beta1_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode(in *schedulingv1beta1.SingleCompositeDisruptionMode, out *scheduling.SingleCompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_v1beta1_SingleCompositeDisruptionMode_To_scheduling_SingleCompositeDisruptionMode(in, out, s)
}
func autoConvert_scheduling_SingleCompositeDisruptionMode_To_v1beta1_SingleCompositeDisruptionMode(in *scheduling.SingleCompositeDisruptionMode, out *schedulingv1beta1.SingleCompositeDisruptionMode, s conversion.Scope) error {
*out = *(*schedulingv1beta1.SingleCompositeDisruptionMode)(unsafe.Pointer(in))
return nil
}
// Convert_scheduling_SingleCompositeDisruptionMode_To_v1beta1_SingleCompositeDisruptionMode is an autogenerated conversion function.
func Convert_scheduling_SingleCompositeDisruptionMode_To_v1beta1_SingleCompositeDisruptionMode(in *scheduling.SingleCompositeDisruptionMode, out *schedulingv1beta1.SingleCompositeDisruptionMode, s conversion.Scope) error {
return autoConvert_scheduling_SingleCompositeDisruptionMode_To_v1beta1_SingleCompositeDisruptionMode(in, out, s)
}
func autoConvert_v1beta1_SingleDisruptionMode_To_scheduling_SingleDisruptionMode(in *schedulingv1beta1.SingleDisruptionMode, out *scheduling.SingleDisruptionMode, s conversion.Scope) error {
*out = *(*scheduling.SingleDisruptionMode)(unsafe.Pointer(in))
return nil

View File

@@ -90,6 +90,89 @@ func RegisterValidations(scheme *runtime.Scheme) error {
return nil
}
var unionMembershipFor_k8s_io_api_scheduling_v1beta1_CompositeDisruptionMode_ = validate.NewUnionMembership(validate.NewUnionMember("single"), validate.NewUnionMember("all"))
// Validate_CompositeDisruptionMode validates an instance of CompositeDisruptionMode according
// to declarative validation rules in the API schema.
func Validate_CompositeDisruptionMode(
ctx context.Context, op operation.Operation, fldPath *field.Path,
obj, oldObj *schedulingv1beta1.CompositeDisruptionMode) (errs field.ErrorList) {
if e := validate.Union(ctx, op, fldPath, obj, oldObj, unionMembershipFor_k8s_io_api_scheduling_v1beta1_CompositeDisruptionMode_,
func(obj *schedulingv1beta1.CompositeDisruptionMode) bool {
if obj == nil {
return false
}
return obj.Single != nil
},
func(obj *schedulingv1beta1.CompositeDisruptionMode) bool {
if obj == nil {
return false
}
return obj.All != nil
}); len(e) != 0 {
errs = append(errs, e...)
}
{ // field schedulingv1beta1.CompositeDisruptionMode.Single
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1beta1.SingleCompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1beta1.CompositeDisruptionMode) *schedulingv1beta1.SingleCompositeDisruptionMode {
return oldObj.Single
})
errs = append(errs, fn(fldPath.Child("single"), obj.Single, oldVal, oldObj != nil)...)
}
{ // field schedulingv1beta1.CompositeDisruptionMode.All
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1beta1.AllCompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1beta1.CompositeDisruptionMode) *schedulingv1beta1.AllCompositeDisruptionMode {
return oldObj.All
})
errs = append(errs, fn(fldPath.Child("all"), obj.All, oldVal, oldObj != nil)...)
}
return errs
}
// Validate_CompositeGangSchedulingPolicy validates an instance of CompositeGangSchedulingPolicy according
// to declarative validation rules in the API schema.
func Validate_CompositeGangSchedulingPolicy(
@@ -329,6 +412,74 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("schedulingPolicy"), &obj.SchedulingPolicy, oldVal, oldObj != nil)...)
}
{ // field schedulingv1beta1.CompositePodGroupTemplate.SchedulingConstraints
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1beta1.CompositePodGroupSchedulingConstraints,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1beta1.CompositePodGroupTemplate) *schedulingv1beta1.CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
}
{ // field schedulingv1beta1.CompositePodGroupTemplate.DisruptionMode
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1beta1.CompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositeDisruptionMode(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1beta1.CompositePodGroupTemplate) *schedulingv1beta1.CompositeDisruptionMode {
return oldObj.DisruptionMode
})
errs = append(errs, fn(fldPath.Child("disruptionMode"), obj.DisruptionMode, oldVal, oldObj != nil)...)
}
{ // field schedulingv1beta1.CompositePodGroupTemplate.PriorityClassName
fn := func(
fldPath *field.Path,
@@ -399,6 +550,47 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("priority"), obj.Priority, oldVal, oldObj != nil)...)
}
{ // field schedulingv1beta1.CompositePodGroupTemplate.PreemptionPolicy
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1beta1.PreemptionPolicy,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.ForbiddenPointer).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", true, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_PreemptionPolicy(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1beta1.CompositePodGroupTemplate) *schedulingv1beta1.PreemptionPolicy {
return oldObj.PreemptionPolicy
})
errs = append(errs, fn(fldPath.Child("preemptionPolicy"), obj.PreemptionPolicy, oldVal, oldObj != nil)...)
}
{ // field schedulingv1beta1.CompositePodGroupTemplate.PodGroupTemplates
fn := func(
fldPath *field.Path,
@@ -505,40 +697,6 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("compositePodGroupTemplates"), obj.CompositePodGroupTemplates, oldVal, oldObj != nil)...)
}
{ // field schedulingv1beta1.CompositePodGroupTemplate.SchedulingConstraints
fn := func(
fldPath *field.Path,
obj, oldObj *schedulingv1beta1.CompositePodGroupSchedulingConstraints,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *schedulingv1beta1.CompositePodGroupTemplate) *schedulingv1beta1.CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
}
return errs
}

View File

@@ -27,6 +27,22 @@ import (
core "k8s.io/kubernetes/pkg/apis/core"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AllCompositeDisruptionMode) DeepCopyInto(out *AllCompositeDisruptionMode) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AllCompositeDisruptionMode.
func (in *AllCompositeDisruptionMode) DeepCopy() *AllCompositeDisruptionMode {
if in == nil {
return nil
}
out := new(AllCompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AllDisruptionMode) DeepCopyInto(out *AllDisruptionMode) {
*out = *in
@@ -75,6 +91,32 @@ func (in *CompositeBasicSchedulingPolicy) DeepCopy() *CompositeBasicSchedulingPo
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CompositeDisruptionMode) DeepCopyInto(out *CompositeDisruptionMode) {
*out = *in
if in.Single != nil {
in, out := &in.Single, &out.Single
*out = new(SingleCompositeDisruptionMode)
**out = **in
}
if in.All != nil {
in, out := &in.All, &out.All
*out = new(AllCompositeDisruptionMode)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CompositeDisruptionMode.
func (in *CompositeDisruptionMode) DeepCopy() *CompositeDisruptionMode {
if in == nil {
return nil
}
out := new(CompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CompositeGangSchedulingPolicy) DeepCopyInto(out *CompositeGangSchedulingPolicy) {
*out = *in
@@ -213,15 +255,25 @@ func (in *CompositePodGroupSpec) DeepCopyInto(out *CompositePodGroupSpec) {
**out = **in
}
in.SchedulingPolicy.DeepCopyInto(&out.SchedulingPolicy)
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
}
if in.DisruptionMode != nil {
in, out := &in.DisruptionMode, &out.DisruptionMode
*out = new(CompositeDisruptionMode)
(*in).DeepCopyInto(*out)
}
if in.Priority != nil {
in, out := &in.Priority, &out.Priority
*out = new(int32)
**out = **in
}
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
if in.PreemptionPolicy != nil {
in, out := &in.PreemptionPolicy, &out.PreemptionPolicy
*out = new(PreemptionPolicy)
**out = **in
}
return
}
@@ -263,11 +315,26 @@ func (in *CompositePodGroupStatus) DeepCopy() *CompositePodGroupStatus {
func (in *CompositePodGroupTemplate) DeepCopyInto(out *CompositePodGroupTemplate) {
*out = *in
in.SchedulingPolicy.DeepCopyInto(&out.SchedulingPolicy)
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
}
if in.DisruptionMode != nil {
in, out := &in.DisruptionMode, &out.DisruptionMode
*out = new(CompositeDisruptionMode)
(*in).DeepCopyInto(*out)
}
if in.Priority != nil {
in, out := &in.Priority, &out.Priority
*out = new(int32)
**out = **in
}
if in.PreemptionPolicy != nil {
in, out := &in.PreemptionPolicy, &out.PreemptionPolicy
*out = new(PreemptionPolicy)
**out = **in
}
if in.PodGroupTemplates != nil {
in, out := &in.PodGroupTemplates, &out.PodGroupTemplates
*out = make([]PodGroupTemplate, len(*in))
@@ -282,11 +349,6 @@ func (in *CompositePodGroupTemplate) DeepCopyInto(out *CompositePodGroupTemplate
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
}
return
}
@@ -689,6 +751,22 @@ func (in *PriorityClassList) DeepCopyObject() runtime.Object {
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SingleCompositeDisruptionMode) DeepCopyInto(out *SingleCompositeDisruptionMode) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SingleCompositeDisruptionMode.
func (in *SingleCompositeDisruptionMode) DeepCopy() *SingleCompositeDisruptionMode {
if in == nil {
return nil
}
out := new(SingleCompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SingleDisruptionMode) DeepCopyInto(out *SingleDisruptionMode) {
*out = *in

View File

@@ -1157,9 +1157,11 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
resourcev1beta2.ResourceSliceSpec{}.OpenAPIModelName(): schema_k8sio_api_resource_v1beta2_ResourceSliceSpec(ref),
schedulingv1.PriorityClass{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1_PriorityClass(ref),
schedulingv1.PriorityClassList{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1_PriorityClassList(ref),
schedulingv1alpha3.AllCompositeDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_AllCompositeDisruptionMode(ref),
schedulingv1alpha3.AllDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_AllDisruptionMode(ref),
schedulingv1alpha3.BasicSchedulingPolicy{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_BasicSchedulingPolicy(ref),
schedulingv1alpha3.CompositeBasicSchedulingPolicy{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_CompositeBasicSchedulingPolicy(ref),
schedulingv1alpha3.CompositeDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_CompositeDisruptionMode(ref),
schedulingv1alpha3.CompositeGangSchedulingPolicy{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_CompositeGangSchedulingPolicy(ref),
schedulingv1alpha3.CompositePodGroup{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_CompositePodGroup(ref),
schedulingv1alpha3.CompositePodGroupList{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_CompositePodGroupList(ref),
@@ -1179,6 +1181,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
schedulingv1alpha3.PodGroupSpec{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_PodGroupSpec(ref),
schedulingv1alpha3.PodGroupStatus{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_PodGroupStatus(ref),
schedulingv1alpha3.PodGroupTemplate{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_PodGroupTemplate(ref),
schedulingv1alpha3.SingleCompositeDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_SingleCompositeDisruptionMode(ref),
schedulingv1alpha3.SingleDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_SingleDisruptionMode(ref),
schedulingv1alpha3.TopologyConstraint{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_TopologyConstraint(ref),
schedulingv1alpha3.TypedLocalObjectReference{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_TypedLocalObjectReference(ref),
@@ -1194,9 +1197,11 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
schedulingv1alpha3.WorkloadPodGroupSingleDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_WorkloadPodGroupSingleDisruptionMode(ref),
schedulingv1alpha3.WorkloadReference{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_WorkloadReference(ref),
schedulingv1alpha3.WorkloadSpec{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1alpha3_WorkloadSpec(ref),
schedulingv1beta1.AllCompositeDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_AllCompositeDisruptionMode(ref),
schedulingv1beta1.AllDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_AllDisruptionMode(ref),
schedulingv1beta1.BasicSchedulingPolicy{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_BasicSchedulingPolicy(ref),
schedulingv1beta1.CompositeBasicSchedulingPolicy{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_CompositeBasicSchedulingPolicy(ref),
schedulingv1beta1.CompositeDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_CompositeDisruptionMode(ref),
schedulingv1beta1.CompositeGangSchedulingPolicy{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_CompositeGangSchedulingPolicy(ref),
schedulingv1beta1.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_CompositePodGroupSchedulingConstraints(ref),
schedulingv1beta1.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_CompositePodGroupSchedulingPolicy(ref),
@@ -1214,6 +1219,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
schedulingv1beta1.PodGroupTemplate{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_PodGroupTemplate(ref),
schedulingv1beta1.PriorityClass{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_PriorityClass(ref),
schedulingv1beta1.PriorityClassList{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_PriorityClassList(ref),
schedulingv1beta1.SingleCompositeDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_SingleCompositeDisruptionMode(ref),
schedulingv1beta1.SingleDisruptionMode{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_SingleDisruptionMode(ref),
schedulingv1beta1.TopologyConstraint{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_TopologyConstraint(ref),
schedulingv1beta1.TypedLocalObjectReference{}.OpenAPIModelName(): schema_k8sio_api_scheduling_v1beta1_TypedLocalObjectReference(ref),
@@ -54776,6 +54782,17 @@ func schema_k8sio_api_scheduling_v1_PriorityClassList(ref common.ReferenceCallba
}
}
func schema_k8sio_api_scheduling_v1alpha3_AllCompositeDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
SchemaProps: spec.SchemaProps{
Description: "AllCompositeDisruptionMode means that children of a CompositePodGroup can only be disrupted or preempted together.",
Type: []string{"object"},
},
},
}
}
func schema_k8sio_api_scheduling_v1alpha3_AllDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -54809,6 +54826,45 @@ func schema_k8sio_api_scheduling_v1alpha3_CompositeBasicSchedulingPolicy(ref com
}
}
func schema_k8sio_api_scheduling_v1alpha3_CompositeDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
SchemaProps: spec.SchemaProps{
Description: "CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted. Exactly one mode must be set.",
Type: []string{"object"},
Properties: map[string]spec.Schema{
"single": {
SchemaProps: spec.SchemaProps{
Description: "single specifies that children groups can be disrupted independently from each other.",
Ref: ref(schedulingv1alpha3.SingleCompositeDisruptionMode{}.OpenAPIModelName()),
},
},
"all": {
SchemaProps: spec.SchemaProps{
Description: "all specifies that all children groups can only be disrupted together.",
Ref: ref(schedulingv1alpha3.AllCompositeDisruptionMode{}.OpenAPIModelName()),
},
},
},
},
VendorExtensible: spec.VendorExtensible{
Extensions: spec.Extensions{
"x-kubernetes-unions": []interface{}{
map[string]interface{}{
"fields-to-discriminateBy": map[string]interface{}{
"all": "All",
"single": "Single",
},
},
},
},
},
},
Dependencies: []string{
schedulingv1alpha3.AllCompositeDisruptionMode{}.OpenAPIModelName(), schedulingv1alpha3.SingleCompositeDisruptionMode{}.OpenAPIModelName()},
}
}
func schema_k8sio_api_scheduling_v1alpha3_CompositeGangSchedulingPolicy(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -55031,6 +55087,19 @@ func schema_k8sio_api_scheduling_v1alpha3_CompositePodGroupSpec(ref common.Refer
Ref: ref(schedulingv1alpha3.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName()),
},
},
"schedulingConstraints": {
SchemaProps: spec.SchemaProps{
Description: "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. This field is immutable.",
Ref: ref(schedulingv1alpha3.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName()),
},
},
"disruptionMode": {
SchemaProps: spec.SchemaProps{
Description: "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. One of Single, All. Defaults to Single if unset. This field is immutable.",
Default: map[string]interface{}{"single": map[string]interface{}{}},
Ref: ref(schedulingv1alpha3.CompositeDisruptionMode{}.OpenAPIModelName()),
},
},
"priorityClassName": {
SchemaProps: spec.SchemaProps{
Description: "priorityClassName defines the priority that should be considered when scheduling this CompositePodGroup. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. If left unspecified, it is validated and resolved similarly to the PriorityClassName field in Pods (i.e. if no priority class is specified, admission control can set this to the global default priority class if it exists. Otherwise, the composite pod group's priority will be zero). This field is immutable.",
@@ -55045,10 +55114,12 @@ func schema_k8sio_api_scheduling_v1alpha3_CompositePodGroupSpec(ref common.Refer
Format: "int32",
},
},
"schedulingConstraints": {
"preemptionPolicy": {
SchemaProps: spec.SchemaProps{
Description: "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. This field is immutable.",
Ref: ref(schedulingv1alpha3.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName()),
Description: "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. When Priority Admission Controller is enabled, it populates this field from PriorityClassName, and defaults to PreemptLowerPriority if value is unset in PriorityClass. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.\n\n\nPossible enum values:\n - `\"Never\"` means that pod never preempts other pods with lower priority.\n - `\"PreemptLowerPriority\"` means that pod can preempt other pods with lower priority.",
Type: []string{"string"},
Format: "",
Enum: []interface{}{"Never", "PreemptLowerPriority"},
},
},
},
@@ -55056,7 +55127,7 @@ func schema_k8sio_api_scheduling_v1alpha3_CompositePodGroupSpec(ref common.Refer
},
},
Dependencies: []string{
schedulingv1alpha3.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName(), schedulingv1alpha3.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName(), schedulingv1alpha3.WorkloadReference{}.OpenAPIModelName()},
schedulingv1alpha3.CompositeDisruptionMode{}.OpenAPIModelName(), schedulingv1alpha3.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName(), schedulingv1alpha3.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName(), schedulingv1alpha3.WorkloadReference{}.OpenAPIModelName()},
}
}
@@ -55120,6 +55191,18 @@ func schema_k8sio_api_scheduling_v1alpha3_CompositePodGroupTemplate(ref common.R
Ref: ref(schedulingv1alpha3.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName()),
},
},
"schedulingConstraints": {
SchemaProps: spec.SchemaProps{
Description: "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate. This field is immutable.",
Ref: ref(schedulingv1alpha3.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName()),
},
},
"disruptionMode": {
SchemaProps: spec.SchemaProps{
Description: "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. One of Single, All. This field is immutable.",
Ref: ref(schedulingv1alpha3.CompositeDisruptionMode{}.OpenAPIModelName()),
},
},
"priorityClassName": {
SchemaProps: spec.SchemaProps{
Description: "priorityClassName indicates the priority that should be considered when scheduling a composite pod group created from this template. If no priority class is specified, admission control can set this to the global default priority class if it exists. Otherwise, composite pod groups created from this template will have the priority set to zero. This field is immutable.",
@@ -55134,6 +55217,14 @@ func schema_k8sio_api_scheduling_v1alpha3_CompositePodGroupTemplate(ref common.R
Format: "int32",
},
},
"preemptionPolicy": {
SchemaProps: spec.SchemaProps{
Description: "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.\n\n\nPossible enum values:\n - `\"Never\"` means that pod never preempts other pods with lower priority.\n - `\"PreemptLowerPriority\"` means that pod can preempt other pods with lower priority.",
Type: []string{"string"},
Format: "",
Enum: []interface{}{"Never", "PreemptLowerPriority"},
},
},
"podGroupTemplates": {
VendorExtensible: spec.VendorExtensible{
Extensions: spec.Extensions{
@@ -55176,18 +55267,12 @@ func schema_k8sio_api_scheduling_v1alpha3_CompositePodGroupTemplate(ref common.R
},
},
},
"schedulingConstraints": {
SchemaProps: spec.SchemaProps{
Description: "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate. This field is immutable.",
Ref: ref(schedulingv1alpha3.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName()),
},
},
},
Required: []string{"name", "schedulingPolicy"},
},
},
Dependencies: []string{
schedulingv1alpha3.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName(), schedulingv1alpha3.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName(), schedulingv1alpha3.CompositePodGroupTemplate{}.OpenAPIModelName(), schedulingv1alpha3.PodGroupTemplate{}.OpenAPIModelName()},
schedulingv1alpha3.CompositeDisruptionMode{}.OpenAPIModelName(), schedulingv1alpha3.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName(), schedulingv1alpha3.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName(), schedulingv1alpha3.CompositePodGroupTemplate{}.OpenAPIModelName(), schedulingv1alpha3.PodGroupTemplate{}.OpenAPIModelName()},
}
}
@@ -55733,6 +55818,17 @@ func schema_k8sio_api_scheduling_v1alpha3_PodGroupTemplate(ref common.ReferenceC
}
}
func schema_k8sio_api_scheduling_v1alpha3_SingleCompositeDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
SchemaProps: spec.SchemaProps{
Description: "SingleCompositeDisruptionMode means that individual children of a CompositePodGroup can be disrupted or preempted independently.",
Type: []string{"object"},
},
},
}
}
func schema_k8sio_api_scheduling_v1alpha3_SingleDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -56190,6 +56286,17 @@ func schema_k8sio_api_scheduling_v1alpha3_WorkloadSpec(ref common.ReferenceCallb
}
}
func schema_k8sio_api_scheduling_v1beta1_AllCompositeDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
SchemaProps: spec.SchemaProps{
Description: "AllCompositeDisruptionMode means that children of a CompositePodGroup can only be disrupted or preempted together.",
Type: []string{"object"},
},
},
}
}
func schema_k8sio_api_scheduling_v1beta1_AllDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -56223,6 +56330,45 @@ func schema_k8sio_api_scheduling_v1beta1_CompositeBasicSchedulingPolicy(ref comm
}
}
func schema_k8sio_api_scheduling_v1beta1_CompositeDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
SchemaProps: spec.SchemaProps{
Description: "CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted. Exactly one mode must be set.",
Type: []string{"object"},
Properties: map[string]spec.Schema{
"single": {
SchemaProps: spec.SchemaProps{
Description: "single specifies that children groups can be disrupted independently from each other.",
Ref: ref(schedulingv1beta1.SingleCompositeDisruptionMode{}.OpenAPIModelName()),
},
},
"all": {
SchemaProps: spec.SchemaProps{
Description: "all specifies that all children groups can only be disrupted together.",
Ref: ref(schedulingv1beta1.AllCompositeDisruptionMode{}.OpenAPIModelName()),
},
},
},
},
VendorExtensible: spec.VendorExtensible{
Extensions: spec.Extensions{
"x-kubernetes-unions": []interface{}{
map[string]interface{}{
"fields-to-discriminateBy": map[string]interface{}{
"all": "All",
"single": "Single",
},
},
},
},
},
},
Dependencies: []string{
schedulingv1beta1.AllCompositeDisruptionMode{}.OpenAPIModelName(), schedulingv1beta1.SingleCompositeDisruptionMode{}.OpenAPIModelName()},
}
}
func schema_k8sio_api_scheduling_v1beta1_CompositeGangSchedulingPolicy(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -56339,6 +56485,18 @@ func schema_k8sio_api_scheduling_v1beta1_CompositePodGroupTemplate(ref common.Re
Ref: ref(schedulingv1beta1.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName()),
},
},
"schedulingConstraints": {
SchemaProps: spec.SchemaProps{
Description: "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate. This field is immutable.",
Ref: ref(schedulingv1beta1.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName()),
},
},
"disruptionMode": {
SchemaProps: spec.SchemaProps{
Description: "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. One of Single, All. This field is immutable.",
Ref: ref(schedulingv1beta1.CompositeDisruptionMode{}.OpenAPIModelName()),
},
},
"priorityClassName": {
SchemaProps: spec.SchemaProps{
Description: "priorityClassName indicates the priority that should be considered when scheduling a composite pod group created from this template. If no priority class is specified, admission control can set this to the global default priority class if it exists. Otherwise, composite pod groups created from this template will have the priority set to zero. This field is immutable.",
@@ -56353,6 +56511,14 @@ func schema_k8sio_api_scheduling_v1beta1_CompositePodGroupTemplate(ref common.Re
Format: "int32",
},
},
"preemptionPolicy": {
SchemaProps: spec.SchemaProps{
Description: "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.\n\n\nPossible enum values:\n - `\"Never\"` means that pod never preempts other pods with lower priority.\n - `\"PreemptLowerPriority\"` means that pod can preempt other pods with lower priority.",
Type: []string{"string"},
Format: "",
Enum: []interface{}{"Never", "PreemptLowerPriority"},
},
},
"podGroupTemplates": {
VendorExtensible: spec.VendorExtensible{
Extensions: spec.Extensions{
@@ -56395,18 +56561,12 @@ func schema_k8sio_api_scheduling_v1beta1_CompositePodGroupTemplate(ref common.Re
},
},
},
"schedulingConstraints": {
SchemaProps: spec.SchemaProps{
Description: "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate. This field is immutable.",
Ref: ref(schedulingv1beta1.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName()),
},
},
},
Required: []string{"name", "schedulingPolicy"},
},
},
Dependencies: []string{
schedulingv1beta1.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName(), schedulingv1beta1.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName(), schedulingv1beta1.CompositePodGroupTemplate{}.OpenAPIModelName(), schedulingv1beta1.PodGroupTemplate{}.OpenAPIModelName()},
schedulingv1beta1.CompositeDisruptionMode{}.OpenAPIModelName(), schedulingv1beta1.CompositePodGroupSchedulingConstraints{}.OpenAPIModelName(), schedulingv1beta1.CompositePodGroupSchedulingPolicy{}.OpenAPIModelName(), schedulingv1beta1.CompositePodGroupTemplate{}.OpenAPIModelName(), schedulingv1beta1.PodGroupTemplate{}.OpenAPIModelName()},
}
}
@@ -57068,6 +57228,17 @@ func schema_k8sio_api_scheduling_v1beta1_PriorityClassList(ref common.ReferenceC
}
}
func schema_k8sio_api_scheduling_v1beta1_SingleCompositeDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
SchemaProps: spec.SchemaProps{
Description: "SingleCompositeDisruptionMode means that individual children of a CompositePodGroup can be disrupted or preempted independently.",
Type: []string{"object"},
},
},
}
}
func schema_k8sio_api_scheduling_v1beta1_SingleDisruptionMode(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{

View File

@@ -62,6 +62,7 @@ func (*compositePodGroupStrategy) PrepareForCreate(ctx context.Context, obj runt
cpg := obj.(*scheduling.CompositePodGroup)
// Status must not be set by user on create.
cpg.Status = scheduling.CompositePodGroupStatus{}
dropDisabledCompositePodGroupFields(cpg, nil)
}
func (*compositePodGroupStrategy) Validate(ctx context.Context, obj runtime.Object) field.ErrorList {
@@ -73,7 +74,8 @@ func (*compositePodGroupStrategy) Validate(ctx context.Context, obj runtime.Obje
// mapped to whether each is enabled.
func (*compositePodGroupStrategy) DeclarativeValidationConfig(ctx context.Context, obj, oldObj runtime.Object) rest.DeclarativeValidationConfig {
return rest.DeclarativeValidationConfig{Options: map[string]bool{
string(features.CompositePodGroup): utilfeature.DefaultFeatureGate.Enabled(features.CompositePodGroup),
string(features.CompositePodGroup): utilfeature.DefaultFeatureGate.Enabled(features.CompositePodGroup),
string(features.PodGroupPreemptionPolicy): utilfeature.DefaultFeatureGate.Enabled(features.PodGroupPreemptionPolicy),
}}
}
@@ -91,6 +93,7 @@ func (*compositePodGroupStrategy) PrepareForUpdate(ctx context.Context, obj, old
newCPG := obj.(*scheduling.CompositePodGroup)
oldCPG := old.(*scheduling.CompositePodGroup)
newCPG.Status = oldCPG.Status
dropDisabledCompositePodGroupFields(newCPG, oldCPG)
}
func (*compositePodGroupStrategy) ValidateUpdate(ctx context.Context, obj, old runtime.Object) field.ErrorList {
@@ -141,3 +144,33 @@ func (r *compositePodGroupStatusStrategy) ValidateUpdate(ctx context.Context, ob
func (*compositePodGroupStatusStrategy) WarningsOnUpdate(ctx context.Context, obj, old runtime.Object) []string {
return nil
}
// dropDisabledCompositePodGroupFields removes fields which are covered by a feature gate.
func dropDisabledCompositePodGroupFields(newCPG, oldCPG *scheduling.CompositePodGroup) {
var newCPGSpec, oldCPGSpec *scheduling.CompositePodGroupSpec
if newCPG != nil {
newCPGSpec = &newCPG.Spec
}
if oldCPG != nil {
oldCPGSpec = &oldCPG.Spec
}
dropDisabledCompositePodGroupSpecFields(newCPGSpec, oldCPGSpec)
}
func dropDisabledCompositePodGroupSpecFields(newCPGSpec, oldCPGSpec *scheduling.CompositePodGroupSpec) {
dropDisabledPreemptionPolicyField(newCPGSpec, oldCPGSpec)
}
// dropDisabledPreemptionPolicyField removes the PreemptionPolicy field unless it is
// already used in the old CompositePodGroup spec.
func dropDisabledPreemptionPolicyField(newCPGSpec, oldCPGSpec *scheduling.CompositePodGroupSpec) {
if utilfeature.DefaultFeatureGate.Enabled(features.PodGroupPreemptionPolicy) || preemptionPolicyInUse(oldCPGSpec) {
// No need to drop anything.
return
}
newCPGSpec.PreemptionPolicy = nil
}
func preemptionPolicyInUse(cpgSpec *scheduling.CompositePodGroupSpec) bool {
return cpgSpec != nil && cpgSpec.PreemptionPolicy != nil
}

View File

@@ -50,15 +50,21 @@ var (
MinGroupCount: 5,
},
},
DisruptionMode: &scheduling.CompositeDisruptionMode{
Single: &scheduling.SingleCompositeDisruptionMode{},
},
},
}
fieldImmutableError = "field is immutable"
minCountError = "must be greater than or equal to 1"
subdomainNameError = "lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters"
maximumError = "must be less than or equal to"
oneOfError = "must specify one of: `basic`, `gang`"
multipleFieldsSetError = "must specify exactly one of: `basic`, `gang`"
fieldImmutableError = "field is immutable"
minCountError = "must be greater than or equal to 1"
subdomainNameError = "lowercase RFC 1123 subdomain must consist of lower case alphanumeric characters"
maximumError = "must be less than or equal to"
oneOfError = "must specify one of: `basic`, `gang`"
multipleSchedulingPoliciesError = "must specify exactly one of: `basic`, `gang`"
multipleDisruptionModesError = "must specify exactly one of: `single`, `all`"
supportedPoliciesError = `supported values: "Never", "PreemptLowerPriority"`
forbiddenError = "Forbidden"
)
func compositePodGroupWithSchedulingConstraints(keys ...string) *scheduling.CompositePodGroup {
@@ -73,6 +79,29 @@ func compositePodGroupWithSchedulingConstraints(keys ...string) *scheduling.Comp
return result
}
func cpgWithDisruptionModeAll() *scheduling.CompositePodGroup {
cpg := cpg.DeepCopy()
cpg.Spec.DisruptionMode = &scheduling.CompositeDisruptionMode{
All: &scheduling.AllCompositeDisruptionMode{},
}
return cpg
}
func cpgWithDisruptionModeBoth() *scheduling.CompositePodGroup {
cpg := cpg.DeepCopy()
cpg.Spec.DisruptionMode = &scheduling.CompositeDisruptionMode{
Single: &scheduling.SingleCompositeDisruptionMode{},
All: &scheduling.AllCompositeDisruptionMode{},
}
return cpg
}
func cpgWithPreemptionPolicy(policy scheduling.PreemptionPolicy) *scheduling.CompositePodGroup {
cpg := cpg.DeepCopy()
cpg.Spec.PreemptionPolicy = &policy
return cpg
}
func TestStrategy(t *testing.T) {
strategy := NewStrategy()
if !strategy.NamespaceScoped() {
@@ -96,9 +125,10 @@ func TestStrategyCreate(t *testing.T) {
ctx := ctxWithRequestInfo()
testCases := map[string]struct {
obj *scheduling.CompositePodGroup
expectObj *scheduling.CompositePodGroup
expectValidationError string
obj *scheduling.CompositePodGroup
expectObj *scheduling.CompositePodGroup
enablePodGroupPreemptionPolicy bool
expectValidationError string
}{
"simple": {
obj: cpg,
@@ -126,7 +156,7 @@ func TestStrategyCreate(t *testing.T) {
c.Spec.SchedulingPolicy.Basic = &scheduling.CompositeBasicSchedulingPolicy{}
return c
}(),
expectValidationError: multipleFieldsSetError,
expectValidationError: multipleSchedulingPoliciesError,
},
"validation error - neither basic nor gang specified": {
obj: func() *scheduling.CompositePodGroup {
@@ -192,6 +222,37 @@ func TestStrategyCreate(t *testing.T) {
obj: compositePodGroupWithSchedulingConstraints("foo-"),
expectValidationError: "Invalid value: \"foo-\"",
},
"disruption mode all": {
obj: cpgWithDisruptionModeAll(),
expectObj: cpgWithDisruptionModeAll(),
},
"both disruption modes set": {
obj: cpgWithDisruptionModeBoth(),
expectValidationError: multipleDisruptionModesError,
},
"podgroup preemptionPolicy disabled - drop preemptionPolicy": {
obj: cpgWithPreemptionPolicy(scheduling.PreemptNever),
expectObj: cpg,
},
"podgroup preemptionPolicy disabled - drop invalid preemptionPolicy": {
obj: cpgWithPreemptionPolicy(scheduling.PreemptionPolicy("Invalid")),
expectObj: cpg,
},
"podgroup preemptionPolicy enabled - preserve preemptionPolicy (Never)": {
obj: cpgWithPreemptionPolicy(scheduling.PreemptNever),
expectObj: cpgWithPreemptionPolicy(scheduling.PreemptNever),
enablePodGroupPreemptionPolicy: true,
},
"podgroup preemptionPolicy enabled - preserve preemptionPolicy (PreemptLowerPriority)": {
obj: cpgWithPreemptionPolicy(scheduling.PreemptLowerPriority),
expectObj: cpgWithPreemptionPolicy(scheduling.PreemptLowerPriority),
enablePodGroupPreemptionPolicy: true,
},
"podgroup preemptionPolicy enabled - invalid preemptionPolicy": {
obj: cpgWithPreemptionPolicy(scheduling.PreemptionPolicy("Invalid")),
enablePodGroupPreemptionPolicy: true,
expectValidationError: supportedPoliciesError,
},
}
for name, tc := range testCases {
@@ -200,6 +261,7 @@ func TestStrategyCreate(t *testing.T) {
features.GenericWorkload: true,
features.CompositePodGroup: true,
features.TopologyAwareWorkloadScheduling: true,
features.PodGroupPreemptionPolicy: tc.enablePodGroupPreemptionPolicy,
})
newCpg := tc.obj.DeepCopy()
@@ -238,9 +300,10 @@ func TestStrategyCreate(t *testing.T) {
func TestStrategyUpdate(t *testing.T) {
ctx := ctxWithRequestInfo()
testCases := map[string]struct {
oldObj *scheduling.CompositePodGroup
newObj *scheduling.CompositePodGroup
expectValidationError string
oldObj *scheduling.CompositePodGroup
newObj *scheduling.CompositePodGroup
enablePodGroupPreemptionPolicy bool
expectValidationErrors []string
}{
"no changes": {
oldObj: cpg,
@@ -253,7 +316,7 @@ func TestStrategyUpdate(t *testing.T) {
newCpg.Name += "bar"
return newCpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"updating workload ref not allowed": {
oldObj: cpg,
@@ -265,7 +328,7 @@ func TestStrategyUpdate(t *testing.T) {
}
return newCpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"changing parentCompositePodGroupName from nil not allowed": {
oldObj: cpg,
@@ -275,7 +338,7 @@ func TestStrategyUpdate(t *testing.T) {
newCpg.Spec.ParentCompositePodGroupName = &parent
return newCpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"changing parentCompositePodGroupName from non-nil not allowed": {
oldObj: func() *scheduling.CompositePodGroup {
@@ -290,7 +353,7 @@ func TestStrategyUpdate(t *testing.T) {
newCpg.Spec.ParentCompositePodGroupName = &parent
return newCpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"changing min group count in gang scheduling policy not allowed": {
oldObj: cpg,
@@ -299,7 +362,7 @@ func TestStrategyUpdate(t *testing.T) {
newCpg.Spec.SchedulingPolicy.Gang.MinGroupCount = 4
return newCpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"changing scheduling policy not allowed": {
oldObj: cpg,
@@ -310,7 +373,12 @@ func TestStrategyUpdate(t *testing.T) {
}
return newCpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"changing disruption mode not allowed": {
oldObj: cpg,
newObj: cpgWithDisruptionModeAll(),
expectValidationErrors: []string{fieldImmutableError},
},
"priority class name update": {
oldObj: cpg,
@@ -319,7 +387,7 @@ func TestStrategyUpdate(t *testing.T) {
cpg.Spec.PriorityClassName = "high-priority"
return cpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"priority update": {
oldObj: cpg,
@@ -328,7 +396,7 @@ func TestStrategyUpdate(t *testing.T) {
cpg.Spec.Priority = new(int32(2000))
return cpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"parentCompositePodGroupName update not allowed": {
oldObj: cpg,
@@ -337,22 +405,33 @@ func TestStrategyUpdate(t *testing.T) {
newCpg.Spec.ParentCompositePodGroupName = new("parent1")
return newCpg
}(),
expectValidationError: fieldImmutableError,
expectValidationErrors: []string{fieldImmutableError},
},
"changing preemptionPolicy not allowed with podgroup preemptionPolicy disabled": {
oldObj: cpgWithPreemptionPolicy(scheduling.PreemptNever),
newObj: cpgWithPreemptionPolicy(scheduling.PreemptLowerPriority),
expectValidationErrors: []string{forbiddenError, fieldImmutableError},
},
"changing preemptionPolicy not allowed with podgroup preemptionPolicy enabled": {
oldObj: cpgWithPreemptionPolicy(scheduling.PreemptNever),
newObj: cpgWithPreemptionPolicy(scheduling.PreemptLowerPriority),
enablePodGroupPreemptionPolicy: true,
expectValidationErrors: []string{fieldImmutableError},
},
"changing scheduling constraints not allowed": {
oldObj: compositePodGroupWithSchedulingConstraints("foo"),
newObj: compositePodGroupWithSchedulingConstraints(),
expectValidationError: fieldImmutableError,
oldObj: compositePodGroupWithSchedulingConstraints("foo"),
newObj: compositePodGroupWithSchedulingConstraints(),
expectValidationErrors: []string{fieldImmutableError},
},
"changing topology constraints not allowed": {
oldObj: compositePodGroupWithSchedulingConstraints("foo"),
newObj: compositePodGroupWithSchedulingConstraints(),
expectValidationError: fieldImmutableError,
oldObj: compositePodGroupWithSchedulingConstraints("foo"),
newObj: compositePodGroupWithSchedulingConstraints(),
expectValidationErrors: []string{fieldImmutableError},
},
"changing topology key not allowed": {
oldObj: compositePodGroupWithSchedulingConstraints("foo"),
newObj: compositePodGroupWithSchedulingConstraints("foobar"),
expectValidationError: fieldImmutableError,
oldObj: compositePodGroupWithSchedulingConstraints("foo"),
newObj: compositePodGroupWithSchedulingConstraints("foobar"),
expectValidationErrors: []string{fieldImmutableError},
},
}
@@ -362,6 +441,7 @@ func TestStrategyUpdate(t *testing.T) {
features.GenericWorkload: true,
features.CompositePodGroup: true,
features.TopologyAwareWorkloadScheduling: true,
features.PodGroupPreemptionPolicy: tc.enablePodGroupPreemptionPolicy,
})
oldCpg := tc.oldObj.DeepCopy()
newCpg := tc.newObj.DeepCopy()
@@ -372,18 +452,20 @@ func TestStrategyUpdate(t *testing.T) {
errs := strategy.ValidateUpdate(ctx, newCpg, oldCpg)
errs = strategy.ValidateDeclaratively(ctx, newCpg, oldCpg, errs, operation.Update, strategy.DeclarativeValidationConfig(ctx, newCpg, oldCpg))
if len(errs) != 0 {
if tc.expectValidationError == "" {
if len(tc.expectValidationErrors) == 0 {
t.Fatalf("unexpected error(s): %v", errs)
}
if len(errs) != 1 {
t.Fatalf("exactly one error expected")
if len(errs) != len(tc.expectValidationErrors) {
t.Fatalf("expected %d errors, got %d", len(tc.expectValidationErrors), len(errs))
}
if errMsg := errs[0].Error(); !strings.Contains(errMsg, tc.expectValidationError) {
t.Fatalf("error %#v does not contain the expected message %q", errMsg, tc.expectValidationError)
for i, err := range errs {
if !strings.Contains(err.Error(), tc.expectValidationErrors[i]) {
t.Fatalf("error %#v does not contain the expected message %q", err.Error(), tc.expectValidationErrors[i])
}
}
return
}
if tc.expectValidationError != "" {
if len(tc.expectValidationErrors) != 0 {
t.Fatal("expected validation error(s), got none")
}
})

View File

@@ -138,7 +138,7 @@ func dropDisabledPodGroupTemplatesFields(templates, oldTemplates []scheduling.Po
template := &templates[i]
dropDisabledSchedulingConstraintsFields(template, oldTemplate)
dropDisabledDRAWorkloadResourceClaimsFields(template, oldTemplate)
dropDisabledPreemptionPolicyFields(template, oldTemplate)
dropDisabledPGPreemptionPolicyFields(template, oldTemplate)
}
}
@@ -151,6 +151,8 @@ func dropDisabledCompositePodGroupTemplatesFields(templates, oldTemplates []sche
template := &templates[i]
oldTemplate := oldTemplatesMap[template.Name]
dropDisabledCPGPreemptionPolicyFields(template, oldTemplate)
var cpgTemplates, oldCpgTemplates []scheduling.CompositePodGroupTemplate
cpgTemplates = template.CompositePodGroupTemplates
if oldTemplate != nil {
@@ -190,10 +192,10 @@ func dropDisabledDRAWorkloadResourceClaimsFields(template, oldTemplate *scheduli
template.ResourceClaims = nil
}
// dropDisabledPreemptionPolicyFields removes the PreemptionPolicy field
// dropDisabledPGPreemptionPolicyFields removes the PreemptionPolicy field
// from the PodGroupTemplate if the PodGroupPreemptionPolicy feature gate is disabled,
// unless the field already used in the old PodGroupTemplate.
func dropDisabledPreemptionPolicyFields(template, oldTemplate *scheduling.PodGroupTemplate) {
func dropDisabledPGPreemptionPolicyFields(template, oldTemplate *scheduling.PodGroupTemplate) {
if utilfeature.DefaultFeatureGate.Enabled(features.PodGroupPreemptionPolicy) || preemptionPolicyInUse(oldTemplate) {
return
}
@@ -211,3 +213,17 @@ func draWorkloadResourceClaimsInUse(pgt *scheduling.PodGroupTemplate) bool {
func preemptionPolicyInUse(pgt *scheduling.PodGroupTemplate) bool {
return pgt != nil && pgt.PreemptionPolicy != nil
}
// dropDisabledCPGPreemptionPolicyFields removes the PreemptionPolicy field
// from the CompositePodGroupTemplate if the PodGroupPreemptionPolicy feature gate is disabled,
// unless the field already used in the old CompositePodGroupTemplate.
func dropDisabledCPGPreemptionPolicyFields(template, oldTemplate *scheduling.CompositePodGroupTemplate) {
if utilfeature.DefaultFeatureGate.Enabled(features.PodGroupPreemptionPolicy) || cpgPreemptionPolicyInUse(oldTemplate) {
return
}
template.PreemptionPolicy = nil
}
func cpgPreemptionPolicyInUse(cpgt *scheduling.CompositePodGroupTemplate) bool {
return cpgt != nil && cpgt.PreemptionPolicy != nil
}

View File

@@ -91,6 +91,7 @@ func TestStrategyCreate(t *testing.T) {
obj *scheduling.Workload
expectObj *scheduling.Workload
enableTopologyAwareScheduling bool
enableCompositePodGroup bool
enablePodGroupPreemptionPolicy bool
expectValidationError string
}{
@@ -273,6 +274,210 @@ func TestStrategyCreate(t *testing.T) {
enablePodGroupPreemptionPolicy: true,
expectValidationError: supportedPoliciesError,
},
"drop cpg preemptionPolicy with PodGroupPreemptionPolicy disabled": {
obj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptNever
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
expectObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
},
"drop invalid cpg preemptionPolicy with PodGroupPreemptionPolicy disabled": {
obj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptionPolicy("Invalid")
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
expectObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
},
"cpg preemptionPolicy set (Never) with PodGroupPreemptionPolicy enabled": {
obj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptNever
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
expectObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptNever
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
enablePodGroupPreemptionPolicy: true,
},
"invalid cpg preemptionPolicy with PodGroupPreemptionPolicy enabled": {
obj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptionPolicy("Invalid")
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
enablePodGroupPreemptionPolicy: true,
expectValidationError: supportedPoliciesError,
},
}
for name, tc := range testCases {
@@ -283,6 +488,7 @@ func TestStrategyCreate(t *testing.T) {
features.GenericWorkload: true,
features.TopologyAwareWorkloadScheduling: tc.enableTopologyAwareScheduling,
features.PodGroupPreemptionPolicy: tc.enablePodGroupPreemptionPolicy,
features.CompositePodGroup: tc.enableCompositePodGroup,
})
Strategy.PrepareForCreate(ctx, workload)
@@ -315,6 +521,7 @@ func TestStrategyUpdate(t *testing.T) {
oldObj *scheduling.Workload
newObj *scheduling.Workload
enableTopologyAwareScheduling bool
enableCompositePodGroup bool
enablePodGroupPreemptionPolicy bool
expectValidationErrors []string
expectWorkload *scheduling.Workload
@@ -606,6 +813,242 @@ func TestStrategyUpdate(t *testing.T) {
}(),
expectValidationErrors: []string{fieldImmutableError},
},
"changing cpg preemptionPolicy not allowed with PodGroupPreemptionPolicy disabled": {
oldObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptNever
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
newObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptLowerPriority
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
expectValidationErrors: []string{forbiddenError, fieldImmutableError},
},
"changing cpg preemptionPolicy not allowed with PodGroupPreemptionPolicy enabled": {
oldObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptNever
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
newObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptLowerPriority
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
enablePodGroupPreemptionPolicy: true,
expectValidationErrors: []string{fieldImmutableError},
},
"clearing cpg preemptionPolicy not allowed with PodGroupPreemptionPolicy enabled": {
oldObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptNever
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
newObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: nil,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
enablePodGroupPreemptionPolicy: true,
expectValidationErrors: []string{fieldImmutableError},
},
"clearing cpg preemptionPolicy not allowed with PodGroupPreemptionPolicy disabled": {
oldObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
policy := scheduling.PreemptNever
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: &policy,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
newObj: func() *scheduling.Workload {
w := workload.DeepCopy()
w.Spec.PodGroupTemplates = nil
w.Spec.CompositePodGroupTemplates = []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PreemptionPolicy: nil,
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
}
return w
}(),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
expectValidationErrors: []string{fieldImmutableError},
},
}
for name, tc := range testCases {
@@ -614,6 +1057,7 @@ func TestStrategyUpdate(t *testing.T) {
features.GenericWorkload: true,
features.TopologyAwareWorkloadScheduling: tc.enableTopologyAwareScheduling,
features.PodGroupPreemptionPolicy: tc.enablePodGroupPreemptionPolicy,
features.CompositePodGroup: tc.enableCompositePodGroup,
})
oldWorkload := tc.oldObj.DeepCopy()
newWorkload := tc.newObj.DeepCopy()
@@ -898,3 +1342,147 @@ func TestDropCompositePodGroupTemplates(t *testing.T) {
})
}
}
func TestDropCompositePodGroupTemplatePreemptionPolicy(t *testing.T) {
var noWorkload *scheduling.Workload
workloadWithoutPreemptionPolicy := &scheduling.Workload{
ObjectMeta: metav1.ObjectMeta{
Name: "foo",
Namespace: metav1.NamespaceDefault,
},
Spec: scheduling.WorkloadSpec{
CompositePodGroupTemplates: []scheduling.CompositePodGroupTemplate{
{
Name: "cpg-template",
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Gang: &scheduling.CompositeGangSchedulingPolicy{
MinGroupCount: 5,
},
},
PodGroupTemplates: []scheduling.PodGroupTemplate{
{
Name: "pg-template",
SchedulingPolicy: scheduling.PodGroupSchedulingPolicy{
Gang: &scheduling.GangSchedulingPolicy{
MinCount: 5,
},
},
},
},
},
},
},
}
workloadWithPreemptionPolicy := func() *scheduling.Workload {
w := workloadWithoutPreemptionPolicy.DeepCopy()
policy := scheduling.PreemptNever
w.Spec.CompositePodGroupTemplates[0].PreemptionPolicy = &policy
return w
}()
tests := []struct {
description string
enabled bool
oldWorkload *scheduling.Workload
newWorkload *scheduling.Workload
wantWorkload *scheduling.Workload
}{
{
description: "old with preemption / new with preemption / disabled",
oldWorkload: workloadWithPreemptionPolicy,
newWorkload: workloadWithPreemptionPolicy,
wantWorkload: workloadWithPreemptionPolicy,
},
{
description: "old without preemption / new with preemption / disabled",
oldWorkload: workloadWithoutPreemptionPolicy,
newWorkload: workloadWithPreemptionPolicy,
wantWorkload: workloadWithoutPreemptionPolicy,
},
{
description: "no old workload / new with preemption / disabled",
oldWorkload: noWorkload,
newWorkload: workloadWithPreemptionPolicy,
wantWorkload: workloadWithoutPreemptionPolicy,
},
{
description: "old with preemption / new without preemption / disabled",
oldWorkload: workloadWithPreemptionPolicy,
newWorkload: workloadWithoutPreemptionPolicy,
wantWorkload: workloadWithoutPreemptionPolicy,
},
{
description: "old without preemption / new without preemption / disabled",
oldWorkload: workloadWithoutPreemptionPolicy,
newWorkload: workloadWithoutPreemptionPolicy,
wantWorkload: workloadWithoutPreemptionPolicy,
},
{
description: "no old workload / new without preemption / disabled",
oldWorkload: noWorkload,
newWorkload: workloadWithoutPreemptionPolicy,
wantWorkload: workloadWithoutPreemptionPolicy,
},
{
description: "old with preemption / new with preemption / enabled",
enabled: true,
oldWorkload: workloadWithPreemptionPolicy,
newWorkload: workloadWithPreemptionPolicy,
wantWorkload: workloadWithPreemptionPolicy,
},
{
description: "old without preemption / new with preemption / enabled",
enabled: true,
oldWorkload: workloadWithoutPreemptionPolicy,
newWorkload: workloadWithPreemptionPolicy,
wantWorkload: workloadWithPreemptionPolicy,
},
{
description: "no old workload / new with preemption / enabled",
enabled: true,
oldWorkload: noWorkload,
newWorkload: workloadWithPreemptionPolicy,
wantWorkload: workloadWithPreemptionPolicy,
},
{
description: "old with preemption / new without preemption / enabled",
enabled: true,
oldWorkload: workloadWithPreemptionPolicy,
newWorkload: workloadWithoutPreemptionPolicy,
wantWorkload: workloadWithoutPreemptionPolicy,
},
{
description: "old without preemption / new without preemption / enabled",
enabled: true,
oldWorkload: workloadWithoutPreemptionPolicy,
newWorkload: workloadWithoutPreemptionPolicy,
wantWorkload: workloadWithoutPreemptionPolicy,
},
{
description: "no old workload / new without preemption / enabled",
enabled: true,
oldWorkload: noWorkload,
newWorkload: workloadWithoutPreemptionPolicy,
wantWorkload: workloadWithoutPreemptionPolicy,
},
}
for _, tc := range tests {
t.Run(tc.description, func(t *testing.T) {
featuregatetesting.SetFeatureGatesDuringTest(t, utilfeature.DefaultFeatureGate, featuregatetesting.FeatureOverrides{
features.PodGroupPreemptionPolicy: tc.enabled,
features.GenericWorkload: true,
features.CompositePodGroup: true,
features.TopologyAwareWorkloadScheduling: true,
})
var oldSpec *scheduling.WorkloadSpec
if tc.oldWorkload != nil {
oldSpec = &tc.oldWorkload.Spec
}
dropDisabledWorkloadSpecFields(&tc.newWorkload.Spec, oldSpec)
if diff := cmp.Diff(tc.wantWorkload, tc.newWorkload); diff != "" {
t.Errorf("new Workload changed (- want, + got): %s", diff)
}
})
}
}

View File

@@ -252,7 +252,7 @@ func (p *Plugin) admitCompositePodGroup(attributes admission.Attributes) error {
return errors.NewBadRequest("resource was marked with kind CompositePodGroup but was unable to be converted")
}
priorityClassName, priority, _, err := p.establishPriority(attributes, &cpg.Spec.PriorityClassName)
priorityClassName, priority, preemptionPolicy, err := p.establishPriority(attributes, &cpg.Spec.PriorityClassName)
if err != nil {
return err
}
@@ -262,6 +262,22 @@ func (p *Plugin) admitCompositePodGroup(attributes admission.Attributes) error {
}
cpg.Spec.Priority = &priority
cpg.Spec.PriorityClassName = priorityClassName
var schedulingPreemptionPolicy scheduling.PreemptionPolicy
if utilfeature.DefaultFeatureGate.Enabled(features.PodGroupPreemptionPolicy) && preemptionPolicy != nil {
switch *preemptionPolicy {
case apiv1.PreemptLowerPriority:
schedulingPreemptionPolicy = scheduling.PreemptLowerPriority
case apiv1.PreemptNever:
schedulingPreemptionPolicy = scheduling.PreemptNever
default:
return admission.NewForbidden(attributes, fmt.Errorf("preemptionPolicy set in the PriorityClass object (%v) must match one of the allowed values of PreemptionPolicy type in composite pod group", *preemptionPolicy))
}
if cpg.Spec.PreemptionPolicy != nil && *cpg.Spec.PreemptionPolicy != schedulingPreemptionPolicy {
return admission.NewForbidden(attributes, fmt.Errorf("the string value of PreemptionPolicy (%s) must not be provided in composite pod group spec; priority admission controller computed %s from the given PriorityClass name", *cpg.Spec.PreemptionPolicy, schedulingPreemptionPolicy))
}
cpg.Spec.PreemptionPolicy = &schedulingPreemptionPolicy
}
return nil
}

View File

@@ -1095,6 +1095,12 @@ func TestAdmitCompositePodGroup(t *testing.T) {
return cpg
}
cpgWithPreemptionPolicy := func(priorityClassName string, policy *scheduling.PreemptionPolicy) *scheduling.CompositePodGroup {
cpg := cpg(priorityClassName)
cpg.Spec.PreemptionPolicy = policy
return cpg
}
attributes := func(cpg *scheduling.CompositePodGroup, operation admission.Operation) admission.Attributes {
var oldCpg runtime.Object
var options runtime.Object = &metav1.CreateOptions{}
@@ -1118,14 +1124,16 @@ func TestAdmitCompositePodGroup(t *testing.T) {
}
testCases := []struct {
name string
priorityClasses []*scheduling.PriorityClass
prepareCpg *scheduling.CompositePodGroup
operation admission.Operation
expectedPriorityClass string
expectedPriority int32
enableCompositePodGroup bool
expectError bool
name string
priorityClasses []*scheduling.PriorityClass
prepareCpg *scheduling.CompositePodGroup
operation admission.Operation
expectedPriorityClass string
expectedPriority int32
expectedPreemptionPolicy *scheduling.PreemptionPolicy
enableCompositePodGroup bool
enablePodGroupPreemptionPolicy bool
expectError bool
}{
{
name: "composite pod group with empty priorityClassName, accepted and set to global default",
@@ -1192,6 +1200,46 @@ func TestAdmitCompositePodGroup(t *testing.T) {
operation: admission.Update,
enableCompositePodGroup: true,
},
{
name: "composite pod group with any preemptionPolicy but PodGroupPreemptionPolicy gate disabled, skips validation",
priorityClasses: []*scheduling.PriorityClass{preemptionPolicyClass},
prepareCpg: cpgWithPreemptionPolicy(preemptionPolicyClass.Name, &schedulingPreemptNever),
operation: admission.Create,
expectedPriorityClass: "nopreemptionpolicy",
expectedPriority: preemptionPolicyClass.Value,
enableCompositePodGroup: true,
},
{
name: "composite pod group with nil preemption policy",
priorityClasses: []*scheduling.PriorityClass{preemptionPolicyClass},
prepareCpg: cpgWithPreemptionPolicy(preemptionPolicyClass.Name, nil),
operation: admission.Create,
expectedPriorityClass: "nopreemptionpolicy",
expectedPriority: preemptionPolicyClass.Value,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: true,
expectedPreemptionPolicy: &schedulingPreemptLowerPriority,
},
{
name: "composite pod group with preemption policy that matches preemption policy resolved from priority class",
priorityClasses: []*scheduling.PriorityClass{preemptionPolicyClass},
prepareCpg: cpgWithPreemptionPolicy(preemptionPolicyClass.Name, &schedulingPreemptLowerPriority),
operation: admission.Create,
expectedPriorityClass: "nopreemptionpolicy",
expectedPriority: preemptionPolicyClass.Value,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: true,
expectedPreemptionPolicy: &schedulingPreemptLowerPriority,
},
{
name: "composite pod group with preemption policy that doesn't match preemption policy resolved from priority class",
priorityClasses: []*scheduling.PriorityClass{preemptionPolicyClass},
prepareCpg: cpgWithPreemptionPolicy(preemptionPolicyClass.Name, &schedulingPreemptNever),
operation: admission.Create,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: true,
expectError: true,
},
}
for _, tt := range testCases {
@@ -1200,6 +1248,7 @@ func TestAdmitCompositePodGroup(t *testing.T) {
features.GenericWorkload: tt.enableCompositePodGroup,
features.TopologyAwareWorkloadScheduling: tt.enableCompositePodGroup,
features.CompositePodGroup: tt.enableCompositePodGroup,
features.PodGroupPreemptionPolicy: tt.enablePodGroupPreemptionPolicy,
})
admissionPlugin := NewPlugin()
@@ -1220,6 +1269,11 @@ func TestAdmitCompositePodGroup(t *testing.T) {
if *tt.prepareCpg.Spec.Priority != tt.expectedPriority {
t.Errorf("CompositePodGroup Admit(), Priority = %v, want = %v", *tt.prepareCpg.Spec.Priority, tt.expectedPriority)
}
if tt.expectedPreemptionPolicy != nil {
if tt.prepareCpg.Spec.PreemptionPolicy == nil || *tt.prepareCpg.Spec.PreemptionPolicy != *tt.expectedPreemptionPolicy {
t.Errorf("CompositePodGroup Admit(), PreemptionPolicy = %v, want = %v", tt.prepareCpg.Spec.PreemptionPolicy, tt.expectedPreemptionPolicy)
}
}
}
if tt.operation != admission.Create {
if diff := cmp.Diff(tt.prepareCpg, cpgCopy); len(diff) > 0 {

File diff suppressed because it is too large Load Diff

View File

@@ -28,6 +28,11 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
// Package-wide variables from generator "generated".
option go_package = "k8s.io/api/scheduling/v1alpha3";
// AllCompositeDisruptionMode means that children of a CompositePodGroup can only be
// disrupted or preempted together.
message AllCompositeDisruptionMode {
}
// AllDisruptionMode specifies that children can only be disrupted together.
message AllDisruptionMode {
}
@@ -42,6 +47,26 @@ message BasicSchedulingPolicy {
message CompositeBasicSchedulingPolicy {
}
// CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted.
// Exactly one mode must be set.
//
// +union
message CompositeDisruptionMode {
// single specifies that children groups can be disrupted independently from each other.
//
// +optional
// +k8s:optional
// +k8s:unionMember
optional SingleCompositeDisruptionMode single = 1;
// all specifies that all children groups can only be disrupted together.
//
// +optional
// +k8s:optional
// +k8s:unionMember
optional AllCompositeDisruptionMode all = 2;
}
// CompositeGangSchedulingPolicy indicates that the groups belonging to the composite group
// should be scheduled using all-or-nothing semantics.
message CompositeGangSchedulingPolicy {
@@ -157,6 +182,26 @@ message CompositePodGroupSpec {
// +k8s:immutable
optional CompositePodGroupSchedulingPolicy schedulingPolicy = 3;
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositePodGroupSchedulingConstraints schedulingConstraints = 4;
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// One of Single, All. Defaults to Single if unset.
// This field is immutable.
//
// +default={"single": {}}
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositeDisruptionMode disruptionMode = 5;
// priorityClassName defines the priority that should be considered when scheduling this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// If left unspecified, it is validated and resolved similarly to the PriorityClassName field in Pods
@@ -168,7 +213,7 @@ message CompositePodGroupSpec {
// +k8s:optional
// +k8s:format=k8s-long-name
// +k8s:immutable
optional string priorityClassName = 4;
optional string priorityClassName = 6;
// priority is the value of priority of this composite pod group. Various system components
// use this field to find the priority of the composite pod group. When Priority Admission
@@ -181,16 +226,21 @@ message CompositePodGroupSpec {
// +k8s:optional
// +k8s:immutable
// +k8s:maximum=1000000000 # HighestUserDefinablePriority
optional int32 priority = 5;
optional int32 priority = 7;
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset.
// When Priority Admission Controller is enabled, it populates this field from PriorityClassName,
// and defaults to PreemptLowerPriority if value is unset in PriorityClass.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
//
// +featureGate=PodGroupPreemptionPolicy
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositePodGroupSchedulingConstraints schedulingConstraints = 6;
// +k8s:ifDisabled("PodGroupPreemptionPolicy")=+k8s:forbidden
// +k8s:ifEnabled("PodGroupPreemptionPolicy")=+k8s:optional
optional string preemptionPolicy = 8;
}
// CompositePodGroupStatus represents information about the status of a composite pod group.
@@ -244,6 +294,23 @@ message CompositePodGroupTemplate {
// +required
optional CompositePodGroupSchedulingPolicy schedulingPolicy = 2;
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositePodGroupSchedulingConstraints schedulingConstraints = 3;
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// One of Single, All.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositeDisruptionMode disruptionMode = 4;
// priorityClassName indicates the priority that should be considered when scheduling
// a composite pod group created from this template. If no priority class is specified,
// admission control can set this to the global default priority class if it exists.
@@ -255,7 +322,7 @@ message CompositePodGroupTemplate {
// +k8s:optional
// +k8s:format=k8s-long-name
// +k8s:immutable
optional string priorityClassName = 3;
optional string priorityClassName = 5;
// priority is the value of priority of composite pod groups created from this template.
// Various system components use this field to find the priority of the composite pod group.
@@ -268,7 +335,19 @@ message CompositePodGroupTemplate {
// +k8s:optional
// +k8s:maximum=1000000000 # HighestUserDefinablePriority
// +k8s:immutable
optional int32 priority = 4;
optional int32 priority = 6;
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
//
// +featureGate=PodGroupPreemptionPolicy
// +optional
// +k8s:immutable
// +k8s:ifDisabled("PodGroupPreemptionPolicy")=+k8s:forbidden
// +k8s:ifEnabled("PodGroupPreemptionPolicy")=+k8s:optional
optional string preemptionPolicy = 7;
// podGroupTemplates is the list of templates for children PodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
@@ -283,7 +362,7 @@ message CompositePodGroupTemplate {
// +k8s:maxItems=8
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
repeated PodGroupTemplate podGroupTemplates = 5;
repeated PodGroupTemplate podGroupTemplates = 8;
// compositePodGroupTemplates is the list of templates for children CompositePodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
@@ -298,15 +377,7 @@ message CompositePodGroupTemplate {
// +k8s:maxItems=8
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
repeated CompositePodGroupTemplate compositePodGroupTemplates = 6;
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositePodGroupSchedulingConstraints schedulingConstraints = 7;
repeated CompositePodGroupTemplate compositePodGroupTemplates = 9;
}
// DisruptionMode defines how individual entities within a group can be disrupted.
@@ -758,6 +829,11 @@ message PodGroupTemplate {
optional string preemptionPolicy = 8;
}
// SingleCompositeDisruptionMode means that individual children of a CompositePodGroup
// can be disrupted or preempted independently.
message SingleCompositeDisruptionMode {
}
// SingleDisruptionMode specifies that children can be disrupted independently.
message SingleDisruptionMode {
}

View File

@@ -251,6 +251,23 @@ type CompositePodGroupTemplate struct {
// +required
SchedulingPolicy CompositePodGroupSchedulingPolicy `json:"schedulingPolicy" protobuf:"bytes,2,opt,name=schedulingPolicy"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
SchedulingConstraints *CompositePodGroupSchedulingConstraints `json:"schedulingConstraints,omitempty" protobuf:"bytes,3,opt,name=schedulingConstraints"`
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// One of Single, All.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
DisruptionMode *CompositeDisruptionMode `json:"disruptionMode,omitempty" protobuf:"bytes,4,opt,name=disruptionMode"`
// priorityClassName indicates the priority that should be considered when scheduling
// a composite pod group created from this template. If no priority class is specified,
// admission control can set this to the global default priority class if it exists.
@@ -262,7 +279,7 @@ type CompositePodGroupTemplate struct {
// +k8s:optional
// +k8s:format=k8s-long-name
// +k8s:immutable
PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,3,opt,name=priorityClassName"`
PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,5,opt,name=priorityClassName"`
// priority is the value of priority of composite pod groups created from this template.
// Various system components use this field to find the priority of the composite pod group.
@@ -275,7 +292,19 @@ type CompositePodGroupTemplate struct {
// +k8s:optional
// +k8s:maximum=1000000000 # HighestUserDefinablePriority
// +k8s:immutable
Priority *int32 `json:"priority,omitempty" protobuf:"varint,4,opt,name=priority"`
Priority *int32 `json:"priority,omitempty" protobuf:"varint,6,opt,name=priority"`
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
//
// +featureGate=PodGroupPreemptionPolicy
// +optional
// +k8s:immutable
// +k8s:ifDisabled("PodGroupPreemptionPolicy")=+k8s:forbidden
// +k8s:ifEnabled("PodGroupPreemptionPolicy")=+k8s:optional
PreemptionPolicy *PreemptionPolicy `json:"preemptionPolicy,omitempty" protobuf:"bytes,7,opt,name=preemptionPolicy"`
// podGroupTemplates is the list of templates for children PodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
@@ -290,7 +319,7 @@ type CompositePodGroupTemplate struct {
// +k8s:maxItems=8
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
PodGroupTemplates []PodGroupTemplate `json:"podGroupTemplates,omitempty" protobuf:"bytes,5,rep,name=podGroupTemplates"`
PodGroupTemplates []PodGroupTemplate `json:"podGroupTemplates,omitempty" protobuf:"bytes,8,rep,name=podGroupTemplates"`
// compositePodGroupTemplates is the list of templates for children CompositePodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
@@ -305,15 +334,7 @@ type CompositePodGroupTemplate struct {
// +k8s:maxItems=8
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
CompositePodGroupTemplates []CompositePodGroupTemplate `json:"compositePodGroupTemplates,omitempty" protobuf:"bytes,6,rep,name=compositePodGroupTemplates"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
SchedulingConstraints *CompositePodGroupSchedulingConstraints `json:"schedulingConstraints,omitempty" protobuf:"bytes,7,opt,name=schedulingConstraints"`
CompositePodGroupTemplates []CompositePodGroupTemplate `json:"compositePodGroupTemplates,omitempty" protobuf:"bytes,9,rep,name=compositePodGroupTemplates"`
}
// PodGroupSchedulingPolicy defines the scheduling configuration for a PodGroup.
@@ -1061,6 +1082,26 @@ type CompositePodGroupSpec struct {
// +k8s:immutable
SchedulingPolicy CompositePodGroupSchedulingPolicy `json:"schedulingPolicy" protobuf:"bytes,3,opt,name=schedulingPolicy"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
SchedulingConstraints *CompositePodGroupSchedulingConstraints `json:"schedulingConstraints,omitempty" protobuf:"bytes,4,opt,name=schedulingConstraints"`
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// One of Single, All. Defaults to Single if unset.
// This field is immutable.
//
// +default={"single": {}}
// +optional
// +k8s:optional
// +k8s:immutable
DisruptionMode *CompositeDisruptionMode `json:"disruptionMode,omitempty" protobuf:"bytes,5,opt,name=disruptionMode"`
// priorityClassName defines the priority that should be considered when scheduling this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// If left unspecified, it is validated and resolved similarly to the PriorityClassName field in Pods
@@ -1072,7 +1113,7 @@ type CompositePodGroupSpec struct {
// +k8s:optional
// +k8s:format=k8s-long-name
// +k8s:immutable
PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,4,opt,name=priorityClassName"`
PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,6,opt,name=priorityClassName"`
// priority is the value of priority of this composite pod group. Various system components
// use this field to find the priority of the composite pod group. When Priority Admission
@@ -1085,16 +1126,21 @@ type CompositePodGroupSpec struct {
// +k8s:optional
// +k8s:immutable
// +k8s:maximum=1000000000 # HighestUserDefinablePriority
Priority *int32 `json:"priority,omitempty" protobuf:"varint,5,opt,name=priority"`
Priority *int32 `json:"priority,omitempty" protobuf:"varint,7,opt,name=priority"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset.
// When Priority Admission Controller is enabled, it populates this field from PriorityClassName,
// and defaults to PreemptLowerPriority if value is unset in PriorityClass.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
//
// +featureGate=PodGroupPreemptionPolicy
// +optional
// +k8s:optional
// +k8s:immutable
SchedulingConstraints *CompositePodGroupSchedulingConstraints `json:"schedulingConstraints,omitempty" protobuf:"bytes,6,opt,name=schedulingConstraints"`
// +k8s:ifDisabled("PodGroupPreemptionPolicy")=+k8s:forbidden
// +k8s:ifEnabled("PodGroupPreemptionPolicy")=+k8s:optional
PreemptionPolicy *PreemptionPolicy `json:"preemptionPolicy,omitempty" protobuf:"bytes,8,opt,name=preemptionPolicy"`
}
// CompositePodGroupSchedulingPolicy defines the scheduling configuration for a CompositePodGroup.
@@ -1144,6 +1190,38 @@ type CompositeGangSchedulingPolicy struct {
MinGroupCount int32 `json:"minGroupCount" protobuf:"varint,1,req,name=minGroupCount"`
}
// CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted.
// Exactly one mode must be set.
//
// +union
type CompositeDisruptionMode struct {
// single specifies that children groups can be disrupted independently from each other.
//
// +optional
// +k8s:optional
// +k8s:unionMember
Single *SingleCompositeDisruptionMode `json:"single,omitempty" protobuf:"bytes,1,opt,name=single"`
// all specifies that all children groups can only be disrupted together.
//
// +optional
// +k8s:optional
// +k8s:unionMember
All *AllCompositeDisruptionMode `json:"all,omitempty" protobuf:"bytes,2,opt,name=all"`
}
// SingleCompositeDisruptionMode means that individual children of a CompositePodGroup
// can be disrupted or preempted independently.
type SingleCompositeDisruptionMode struct {
// This is intentionally empty.
}
// AllCompositeDisruptionMode means that children of a CompositePodGroup can only be
// disrupted or preempted together.
type AllCompositeDisruptionMode struct {
// This is intentionally empty.
}
// CompositePodGroupStatus represents information about the status of a composite pod group.
type CompositePodGroupStatus struct {
// conditions represent the latest observations of the CompositePodGroup's state.

View File

@@ -27,6 +27,14 @@ package v1alpha3
// Those methods can be generated by using hack/update-codegen.sh
// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT.
var map_AllCompositeDisruptionMode = map[string]string{
"": "AllCompositeDisruptionMode means that children of a CompositePodGroup can only be disrupted or preempted together.",
}
func (AllCompositeDisruptionMode) SwaggerDoc() map[string]string {
return map_AllCompositeDisruptionMode
}
var map_AllDisruptionMode = map[string]string{
"": "AllDisruptionMode specifies that children can only be disrupted together.",
}
@@ -51,6 +59,16 @@ func (CompositeBasicSchedulingPolicy) SwaggerDoc() map[string]string {
return map_CompositeBasicSchedulingPolicy
}
var map_CompositeDisruptionMode = map[string]string{
"": "CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted. Exactly one mode must be set.",
"single": "single specifies that children groups can be disrupted independently from each other.",
"all": "all specifies that all children groups can only be disrupted together.",
}
func (CompositeDisruptionMode) SwaggerDoc() map[string]string {
return map_CompositeDisruptionMode
}
var map_CompositeGangSchedulingPolicy = map[string]string{
"": "CompositeGangSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled using all-or-nothing semantics.",
"minGroupCount": "minGroupCount is the minimum number of child groups that must be schedulable or scheduled at the same time for the scheduler to admit the entire group. It must be a positive integer.",
@@ -105,9 +123,11 @@ var map_CompositePodGroupSpec = map[string]string{
"parentCompositePodGroupName": "parentCompositePodGroupName contains the name of the parent composite pod group within the same namespace as this composite pod group. It must be a DNS name. If it's nil, then this composite pod group is a root of a workload's hierarchy. This field is immutable.",
"workloadRef": "workloadRef references an optional CompositePodGroup template within the Workload object that was used to create the CompositePodGroup. This field is required. This field is immutable.",
"schedulingPolicy": "schedulingPolicy defines the scheduling policy for this instance of the CompositePodGroup. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. This field is immutable.",
"schedulingConstraints": "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. This field is immutable.",
"disruptionMode": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. One of Single, All. Defaults to Single if unset. This field is immutable.",
"priorityClassName": "priorityClassName defines the priority that should be considered when scheduling this CompositePodGroup. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. If left unspecified, it is validated and resolved similarly to the PriorityClassName field in Pods (i.e. if no priority class is specified, admission control can set this to the global default priority class if it exists. Otherwise, the composite pod group's priority will be zero). This field is immutable.",
"priority": "priority is the value of priority of this composite pod group. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"schedulingConstraints": "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup. Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate. This field is immutable.",
"preemptionPolicy": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. When Priority Admission Controller is enabled, it populates this field from PriorityClassName, and defaults to PreemptLowerPriority if value is unset in PriorityClass. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
}
func (CompositePodGroupSpec) SwaggerDoc() map[string]string {
@@ -127,11 +147,13 @@ var map_CompositePodGroupTemplate = map[string]string{
"": "CompositePodGroupTemplate represents a template for a CompositePodGroup with a scheduling policy.",
"name": "name is a unique identifier for the CompositePodGroupTemplate within the Workload. It must be a DNS label. This field is required.",
"schedulingPolicy": "schedulingPolicy defines the scheduling policy for this template.",
"schedulingConstraints": "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate. This field is immutable.",
"disruptionMode": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. One of Single, All. This field is immutable.",
"priorityClassName": "priorityClassName indicates the priority that should be considered when scheduling a composite pod group created from this template. If no priority class is specified, admission control can set this to the global default priority class if it exists. Otherwise, composite pod groups created from this template will have the priority set to zero. This field is immutable.",
"priority": "priority is the value of priority of composite pod groups created from this template. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"preemptionPolicy": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
"podGroupTemplates": "podGroupTemplates is the list of templates for children PodGroups. The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates or PodGroupTemplates must be set.",
"compositePodGroupTemplates": "compositePodGroupTemplates is the list of templates for children CompositePodGroups. The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates or PodGroupTemplates must be set.",
"schedulingConstraints": "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate. This field is immutable.",
}
func (CompositePodGroupTemplate) SwaggerDoc() map[string]string {
@@ -261,6 +283,14 @@ func (PodGroupTemplate) SwaggerDoc() map[string]string {
return map_PodGroupTemplate
}
var map_SingleCompositeDisruptionMode = map[string]string{
"": "SingleCompositeDisruptionMode means that individual children of a CompositePodGroup can be disrupted or preempted independently.",
}
func (SingleCompositeDisruptionMode) SwaggerDoc() map[string]string {
return map_SingleCompositeDisruptionMode
}
var map_SingleDisruptionMode = map[string]string{
"": "SingleDisruptionMode specifies that children can be disrupted independently.",
}

View File

@@ -26,6 +26,22 @@ import (
runtime "k8s.io/apimachinery/pkg/runtime"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AllCompositeDisruptionMode) DeepCopyInto(out *AllCompositeDisruptionMode) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AllCompositeDisruptionMode.
func (in *AllCompositeDisruptionMode) DeepCopy() *AllCompositeDisruptionMode {
if in == nil {
return nil
}
out := new(AllCompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AllDisruptionMode) DeepCopyInto(out *AllDisruptionMode) {
*out = *in
@@ -74,6 +90,32 @@ func (in *CompositeBasicSchedulingPolicy) DeepCopy() *CompositeBasicSchedulingPo
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CompositeDisruptionMode) DeepCopyInto(out *CompositeDisruptionMode) {
*out = *in
if in.Single != nil {
in, out := &in.Single, &out.Single
*out = new(SingleCompositeDisruptionMode)
**out = **in
}
if in.All != nil {
in, out := &in.All, &out.All
*out = new(AllCompositeDisruptionMode)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CompositeDisruptionMode.
func (in *CompositeDisruptionMode) DeepCopy() *CompositeDisruptionMode {
if in == nil {
return nil
}
out := new(CompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CompositeGangSchedulingPolicy) DeepCopyInto(out *CompositeGangSchedulingPolicy) {
*out = *in
@@ -212,15 +254,25 @@ func (in *CompositePodGroupSpec) DeepCopyInto(out *CompositePodGroupSpec) {
**out = **in
}
in.SchedulingPolicy.DeepCopyInto(&out.SchedulingPolicy)
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
}
if in.DisruptionMode != nil {
in, out := &in.DisruptionMode, &out.DisruptionMode
*out = new(CompositeDisruptionMode)
(*in).DeepCopyInto(*out)
}
if in.Priority != nil {
in, out := &in.Priority, &out.Priority
*out = new(int32)
**out = **in
}
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
if in.PreemptionPolicy != nil {
in, out := &in.PreemptionPolicy, &out.PreemptionPolicy
*out = new(PreemptionPolicy)
**out = **in
}
return
}
@@ -262,11 +314,26 @@ func (in *CompositePodGroupStatus) DeepCopy() *CompositePodGroupStatus {
func (in *CompositePodGroupTemplate) DeepCopyInto(out *CompositePodGroupTemplate) {
*out = *in
in.SchedulingPolicy.DeepCopyInto(&out.SchedulingPolicy)
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
}
if in.DisruptionMode != nil {
in, out := &in.DisruptionMode, &out.DisruptionMode
*out = new(CompositeDisruptionMode)
(*in).DeepCopyInto(*out)
}
if in.Priority != nil {
in, out := &in.Priority, &out.Priority
*out = new(int32)
**out = **in
}
if in.PreemptionPolicy != nil {
in, out := &in.PreemptionPolicy, &out.PreemptionPolicy
*out = new(PreemptionPolicy)
**out = **in
}
if in.PodGroupTemplates != nil {
in, out := &in.PodGroupTemplates, &out.PodGroupTemplates
*out = make([]PodGroupTemplate, len(*in))
@@ -281,11 +348,6 @@ func (in *CompositePodGroupTemplate) DeepCopyInto(out *CompositePodGroupTemplate
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
}
return
}
@@ -624,6 +686,22 @@ func (in *PodGroupTemplate) DeepCopy() *PodGroupTemplate {
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SingleCompositeDisruptionMode) DeepCopyInto(out *SingleCompositeDisruptionMode) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SingleCompositeDisruptionMode.
func (in *SingleCompositeDisruptionMode) DeepCopy() *SingleCompositeDisruptionMode {
if in == nil {
return nil
}
out := new(SingleCompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SingleDisruptionMode) DeepCopyInto(out *SingleDisruptionMode) {
*out = *in

View File

@@ -21,6 +21,11 @@ limitations under the License.
package v1alpha3
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in AllCompositeDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1alpha3.AllCompositeDisruptionMode"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in AllDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1alpha3.AllDisruptionMode"
@@ -36,6 +41,11 @@ func (in CompositeBasicSchedulingPolicy) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1alpha3.CompositeBasicSchedulingPolicy"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in CompositeDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in CompositeGangSchedulingPolicy) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1alpha3.CompositeGangSchedulingPolicy"
@@ -131,6 +141,11 @@ func (in PodGroupTemplate) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1alpha3.PodGroupTemplate"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in SingleCompositeDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1alpha3.SingleCompositeDisruptionMode"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in SingleDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1alpha3.SingleDisruptionMode"

View File

@@ -34,6 +34,89 @@ import (
field "k8s.io/apimachinery/pkg/util/validation/field"
)
var unionMembershipFor_k8s_io_api_scheduling_v1alpha3_CompositeDisruptionMode_ = validate.NewUnionMembership(validate.NewUnionMember("single"), validate.NewUnionMember("all"))
// Validate_CompositeDisruptionMode validates an instance of CompositeDisruptionMode according
// to declarative validation rules in the API schema.
func Validate_CompositeDisruptionMode(
ctx context.Context, op operation.Operation, fldPath *field.Path,
obj, oldObj *CompositeDisruptionMode) (errs field.ErrorList) {
if e := validate.Union(ctx, op, fldPath, obj, oldObj, unionMembershipFor_k8s_io_api_scheduling_v1alpha3_CompositeDisruptionMode_,
func(obj *CompositeDisruptionMode) bool {
if obj == nil {
return false
}
return obj.Single != nil
},
func(obj *CompositeDisruptionMode) bool {
if obj == nil {
return false
}
return obj.All != nil
}); len(e) != 0 {
errs = append(errs, e...)
}
{ // field CompositeDisruptionMode.Single
fn := func(
fldPath *field.Path,
obj, oldObj *SingleCompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositeDisruptionMode) *SingleCompositeDisruptionMode {
return oldObj.Single
})
errs = append(errs, fn(fldPath.Child("single"), obj.Single, oldVal, oldObj != nil)...)
}
{ // field CompositeDisruptionMode.All
fn := func(
fldPath *field.Path,
obj, oldObj *AllCompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositeDisruptionMode) *AllCompositeDisruptionMode {
return oldObj.All
})
errs = append(errs, fn(fldPath.Child("all"), obj.All, oldVal, oldObj != nil)...)
}
return errs
}
// Validate_CompositeGangSchedulingPolicy validates an instance of CompositeGangSchedulingPolicy according
// to declarative validation rules in the API schema.
func Validate_CompositeGangSchedulingPolicy(
@@ -397,6 +480,76 @@ func Validate_CompositePodGroupSpec(
errs = append(errs, fn(fldPath.Child("schedulingPolicy"), &obj.SchedulingPolicy, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupSpec.SchedulingConstraints
fn := func(
fldPath *field.Path,
obj, oldObj *CompositePodGroupSchedulingConstraints,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositePodGroupSpec) *CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupSpec.DisruptionMode
fn := func(
fldPath *field.Path,
obj, oldObj *CompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
// optional fields with default values are effectively required
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositeDisruptionMode(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositePodGroupSpec) *CompositeDisruptionMode {
return oldObj.DisruptionMode
})
errs = append(errs, fn(fldPath.Child("disruptionMode"), obj.DisruptionMode, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupSpec.PriorityClassName
fn := func(
fldPath *field.Path,
@@ -467,38 +620,45 @@ func Validate_CompositePodGroupSpec(
errs = append(errs, fn(fldPath.Child("priority"), obj.Priority, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupSpec.SchedulingConstraints
{ // field CompositePodGroupSpec.PreemptionPolicy
fn := func(
fldPath *field.Path,
obj, oldObj *CompositePodGroupSchedulingConstraints,
obj, oldObj *PreemptionPolicy,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.ForbiddenPointer).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", true, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
errs = append(errs, Validate_PreemptionPolicy(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositePodGroupSpec) *CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
func(oldObj *CompositePodGroupSpec) *PreemptionPolicy {
return oldObj.PreemptionPolicy
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
errs = append(errs, fn(fldPath.Child("preemptionPolicy"), obj.PreemptionPolicy, oldVal, oldObj != nil)...)
}
return errs
@@ -611,6 +771,74 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("schedulingPolicy"), &obj.SchedulingPolicy, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupTemplate.SchedulingConstraints
fn := func(
fldPath *field.Path,
obj, oldObj *CompositePodGroupSchedulingConstraints,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositePodGroupTemplate) *CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupTemplate.DisruptionMode
fn := func(
fldPath *field.Path,
obj, oldObj *CompositeDisruptionMode,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositeDisruptionMode(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositePodGroupTemplate) *CompositeDisruptionMode {
return oldObj.DisruptionMode
})
errs = append(errs, fn(fldPath.Child("disruptionMode"), obj.DisruptionMode, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupTemplate.PriorityClassName
fn := func(
fldPath *field.Path,
@@ -681,6 +909,47 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("priority"), obj.Priority, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupTemplate.PreemptionPolicy
fn := func(
fldPath *field.Path,
obj, oldObj *PreemptionPolicy,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.ForbiddenPointer).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", false, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.IfOption(ctx, op, fldPath, obj, oldObj, "PodGroupPreemptionPolicy", true, validate.OptionalPointer).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_PreemptionPolicy(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositePodGroupTemplate) *PreemptionPolicy {
return oldObj.PreemptionPolicy
})
errs = append(errs, fn(fldPath.Child("preemptionPolicy"), obj.PreemptionPolicy, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupTemplate.PodGroupTemplates
fn := func(
fldPath *field.Path,
@@ -775,40 +1044,6 @@ func Validate_CompositePodGroupTemplate(
errs = append(errs, fn(fldPath.Child("compositePodGroupTemplates"), obj.CompositePodGroupTemplates, oldVal, oldObj != nil)...)
}
{ // field CompositePodGroupTemplate.SchedulingConstraints
fn := func(
fldPath *field.Path,
obj, oldObj *CompositePodGroupSchedulingConstraints,
oldValueCorrelated bool) (errs field.ErrorList) {
// don't revalidate unchanged data
if oldValueCorrelated && op.Type == operation.Update {
if equality.Semantic.DeepEqual(obj, oldObj) {
return nil
}
}
// call field-attached validations
earlyReturn := false
if e := validate.Immutable(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
errs = append(errs, e...)
earlyReturn = true
}
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj).MarkShortCircuit(); len(e) != 0 {
earlyReturn = true
}
if earlyReturn {
return // do not proceed
}
// call the type's validation function
errs = append(errs, Validate_CompositePodGroupSchedulingConstraints(ctx, op, fldPath, obj, oldObj)...)
return
}
oldVal := safe.Field(oldObj,
func(oldObj *CompositePodGroupTemplate) *CompositePodGroupSchedulingConstraints {
return oldObj.SchedulingConstraints
})
errs = append(errs, fn(fldPath.Child("schedulingConstraints"), obj.SchedulingConstraints, oldVal, oldObj != nil)...)
}
return errs
}

View File

@@ -32,12 +32,16 @@ import (
strings "strings"
)
func (m *AllCompositeDisruptionMode) Reset() { *m = AllCompositeDisruptionMode{} }
func (m *AllDisruptionMode) Reset() { *m = AllDisruptionMode{} }
func (m *BasicSchedulingPolicy) Reset() { *m = BasicSchedulingPolicy{} }
func (m *CompositeBasicSchedulingPolicy) Reset() { *m = CompositeBasicSchedulingPolicy{} }
func (m *CompositeDisruptionMode) Reset() { *m = CompositeDisruptionMode{} }
func (m *CompositeGangSchedulingPolicy) Reset() { *m = CompositeGangSchedulingPolicy{} }
func (m *CompositePodGroupSchedulingConstraints) Reset() {
@@ -74,6 +78,8 @@ func (m *PriorityClass) Reset() { *m = PriorityClass{} }
func (m *PriorityClassList) Reset() { *m = PriorityClassList{} }
func (m *SingleCompositeDisruptionMode) Reset() { *m = SingleCompositeDisruptionMode{} }
func (m *SingleDisruptionMode) Reset() { *m = SingleDisruptionMode{} }
func (m *TopologyConstraint) Reset() { *m = TopologyConstraint{} }
@@ -88,6 +94,29 @@ func (m *WorkloadReference) Reset() { *m = WorkloadReference{} }
func (m *WorkloadSpec) Reset() { *m = WorkloadSpec{} }
func (m *AllCompositeDisruptionMode) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *AllCompositeDisruptionMode) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *AllCompositeDisruptionMode) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
return len(dAtA) - i, nil
}
func (m *AllDisruptionMode) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -157,6 +186,53 @@ func (m *CompositeBasicSchedulingPolicy) MarshalToSizedBuffer(dAtA []byte) (int,
return len(dAtA) - i, nil
}
func (m *CompositeDisruptionMode) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *CompositeDisruptionMode) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *CompositeDisruptionMode) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.All != nil {
{
size, err := m.All.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
if m.Single != nil {
{
size, err := m.Single.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *CompositeGangSchedulingPolicy) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -287,18 +363,6 @@ func (m *CompositePodGroupTemplate) MarshalToSizedBuffer(dAtA []byte) (int, erro
_ = i
var l int
_ = l
if m.SchedulingConstraints != nil {
{
size, err := m.SchedulingConstraints.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x3a
}
if len(m.CompositePodGroupTemplates) > 0 {
for iNdEx := len(m.CompositePodGroupTemplates) - 1; iNdEx >= 0; iNdEx-- {
{
@@ -310,7 +374,7 @@ func (m *CompositePodGroupTemplate) MarshalToSizedBuffer(dAtA []byte) (int, erro
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x32
dAtA[i] = 0x4a
}
}
if len(m.PodGroupTemplates) > 0 {
@@ -324,19 +388,50 @@ func (m *CompositePodGroupTemplate) MarshalToSizedBuffer(dAtA []byte) (int, erro
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x2a
dAtA[i] = 0x42
}
}
if m.PreemptionPolicy != nil {
i -= len(*m.PreemptionPolicy)
copy(dAtA[i:], *m.PreemptionPolicy)
i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PreemptionPolicy)))
i--
dAtA[i] = 0x3a
}
if m.Priority != nil {
i = encodeVarintGenerated(dAtA, i, uint64(*m.Priority))
i--
dAtA[i] = 0x20
dAtA[i] = 0x30
}
i -= len(m.PriorityClassName)
copy(dAtA[i:], m.PriorityClassName)
i = encodeVarintGenerated(dAtA, i, uint64(len(m.PriorityClassName)))
i--
dAtA[i] = 0x1a
dAtA[i] = 0x2a
if m.DisruptionMode != nil {
{
size, err := m.DisruptionMode.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x22
}
if m.SchedulingConstraints != nil {
{
size, err := m.SchedulingConstraints.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintGenerated(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x1a
}
{
size, err := m.SchedulingPolicy.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
@@ -1043,6 +1138,29 @@ func (m *PriorityClassList) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
func (m *SingleCompositeDisruptionMode) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
if err != nil {
return nil, err
}
return dAtA[:n], nil
}
func (m *SingleCompositeDisruptionMode) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *SingleCompositeDisruptionMode) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
return len(dAtA) - i, nil
}
func (m *SingleDisruptionMode) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -1329,6 +1447,15 @@ func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int {
dAtA[offset] = uint8(v)
return base
}
func (m *AllCompositeDisruptionMode) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
return n
}
func (m *AllDisruptionMode) Size() (n int) {
if m == nil {
return 0
@@ -1356,6 +1483,23 @@ func (m *CompositeBasicSchedulingPolicy) Size() (n int) {
return n
}
func (m *CompositeDisruptionMode) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if m.Single != nil {
l = m.Single.Size()
n += 1 + l + sovGenerated(uint64(l))
}
if m.All != nil {
l = m.All.Size()
n += 1 + l + sovGenerated(uint64(l))
}
return n
}
func (m *CompositeGangSchedulingPolicy) Size() (n int) {
if m == nil {
return 0
@@ -1408,11 +1552,23 @@ func (m *CompositePodGroupTemplate) Size() (n int) {
n += 1 + l + sovGenerated(uint64(l))
l = m.SchedulingPolicy.Size()
n += 1 + l + sovGenerated(uint64(l))
if m.SchedulingConstraints != nil {
l = m.SchedulingConstraints.Size()
n += 1 + l + sovGenerated(uint64(l))
}
if m.DisruptionMode != nil {
l = m.DisruptionMode.Size()
n += 1 + l + sovGenerated(uint64(l))
}
l = len(m.PriorityClassName)
n += 1 + l + sovGenerated(uint64(l))
if m.Priority != nil {
n += 1 + sovGenerated(uint64(*m.Priority))
}
if m.PreemptionPolicy != nil {
l = len(*m.PreemptionPolicy)
n += 1 + l + sovGenerated(uint64(l))
}
if len(m.PodGroupTemplates) > 0 {
for _, e := range m.PodGroupTemplates {
l = e.Size()
@@ -1425,10 +1581,6 @@ func (m *CompositePodGroupTemplate) Size() (n int) {
n += 1 + l + sovGenerated(uint64(l))
}
}
if m.SchedulingConstraints != nil {
l = m.SchedulingConstraints.Size()
n += 1 + l + sovGenerated(uint64(l))
}
return n
}
@@ -1692,6 +1844,15 @@ func (m *PriorityClassList) Size() (n int) {
return n
}
func (m *SingleCompositeDisruptionMode) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
return n
}
func (m *SingleDisruptionMode) Size() (n int) {
if m == nil {
return 0
@@ -1801,6 +1962,15 @@ func sovGenerated(x uint64) (n int) {
func sozGenerated(x uint64) (n int) {
return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63))))
}
func (this *AllCompositeDisruptionMode) String() string {
if this == nil {
return "nil"
}
s := strings.Join([]string{`&AllCompositeDisruptionMode{`,
`}`,
}, "")
return s
}
func (this *AllDisruptionMode) String() string {
if this == nil {
return "nil"
@@ -1828,6 +1998,17 @@ func (this *CompositeBasicSchedulingPolicy) String() string {
}, "")
return s
}
func (this *CompositeDisruptionMode) String() string {
if this == nil {
return "nil"
}
s := strings.Join([]string{`&CompositeDisruptionMode{`,
`Single:` + strings.Replace(this.Single.String(), "SingleCompositeDisruptionMode", "SingleCompositeDisruptionMode", 1) + `,`,
`All:` + strings.Replace(this.All.String(), "AllCompositeDisruptionMode", "AllCompositeDisruptionMode", 1) + `,`,
`}`,
}, "")
return s
}
func (this *CompositeGangSchedulingPolicy) String() string {
if this == nil {
return "nil"
@@ -1881,11 +2062,13 @@ func (this *CompositePodGroupTemplate) String() string {
s := strings.Join([]string{`&CompositePodGroupTemplate{`,
`Name:` + fmt.Sprintf("%v", this.Name) + `,`,
`SchedulingPolicy:` + strings.Replace(strings.Replace(this.SchedulingPolicy.String(), "CompositePodGroupSchedulingPolicy", "CompositePodGroupSchedulingPolicy", 1), `&`, ``, 1) + `,`,
`SchedulingConstraints:` + strings.Replace(this.SchedulingConstraints.String(), "CompositePodGroupSchedulingConstraints", "CompositePodGroupSchedulingConstraints", 1) + `,`,
`DisruptionMode:` + strings.Replace(this.DisruptionMode.String(), "CompositeDisruptionMode", "CompositeDisruptionMode", 1) + `,`,
`PriorityClassName:` + fmt.Sprintf("%v", this.PriorityClassName) + `,`,
`Priority:` + valueToStringGenerated(this.Priority) + `,`,
`PreemptionPolicy:` + valueToStringGenerated(this.PreemptionPolicy) + `,`,
`PodGroupTemplates:` + repeatedStringForPodGroupTemplates + `,`,
`CompositePodGroupTemplates:` + repeatedStringForCompositePodGroupTemplates + `,`,
`SchedulingConstraints:` + strings.Replace(this.SchedulingConstraints.String(), "CompositePodGroupSchedulingConstraints", "CompositePodGroupSchedulingConstraints", 1) + `,`,
`}`,
}, "")
return s
@@ -2084,6 +2267,15 @@ func (this *PriorityClassList) String() string {
}, "")
return s
}
func (this *SingleCompositeDisruptionMode) String() string {
if this == nil {
return "nil"
}
s := strings.Join([]string{`&SingleCompositeDisruptionMode{`,
`}`,
}, "")
return s
}
func (this *SingleDisruptionMode) String() string {
if this == nil {
return "nil"
@@ -2183,6 +2375,56 @@ func valueToStringGenerated(v interface{}) string {
pv := reflect.Indirect(rv).Interface()
return fmt.Sprintf("*%v", pv)
}
func (m *AllCompositeDisruptionMode) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: AllCompositeDisruptionMode: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: AllCompositeDisruptionMode: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthGenerated
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *AllDisruptionMode) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@@ -2333,6 +2575,128 @@ func (m *CompositeBasicSchedulingPolicy) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *CompositeDisruptionMode) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: CompositeDisruptionMode: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: CompositeDisruptionMode: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Single", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthGenerated
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Single == nil {
m.Single = &SingleCompositeDisruptionMode{}
}
if err := m.Single.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field All", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthGenerated
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.All == nil {
m.All = &AllCompositeDisruptionMode{}
}
if err := m.All.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthGenerated
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *CompositeGangSchedulingPolicy) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@@ -2703,6 +3067,78 @@ func (m *CompositePodGroupTemplate) Unmarshal(dAtA []byte) error {
}
iNdEx = postIndex
case 3:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field SchedulingConstraints", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthGenerated
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.SchedulingConstraints == nil {
m.SchedulingConstraints = &CompositePodGroupSchedulingConstraints{}
}
if err := m.SchedulingConstraints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 4:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field DisruptionMode", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthGenerated
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.DisruptionMode == nil {
m.DisruptionMode = &CompositeDisruptionMode{}
}
if err := m.DisruptionMode.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 5:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field PriorityClassName", wireType)
}
@@ -2734,7 +3170,7 @@ func (m *CompositePodGroupTemplate) Unmarshal(dAtA []byte) error {
}
m.PriorityClassName = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 4:
case 6:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Priority", wireType)
}
@@ -2754,7 +3190,40 @@ func (m *CompositePodGroupTemplate) Unmarshal(dAtA []byte) error {
}
}
m.Priority = &v
case 5:
case 7:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field PreemptionPolicy", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
intStringLen := int(stringLen)
if intStringLen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthGenerated
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
s := PreemptionPolicy(dAtA[iNdEx:postIndex])
m.PreemptionPolicy = &s
iNdEx = postIndex
case 8:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field PodGroupTemplates", wireType)
}
@@ -2788,7 +3257,7 @@ func (m *CompositePodGroupTemplate) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 6:
case 9:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field CompositePodGroupTemplates", wireType)
}
@@ -2822,42 +3291,6 @@ func (m *CompositePodGroupTemplate) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
case 7:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field SchedulingConstraints", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthGenerated
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthGenerated
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.SchedulingConstraints == nil {
m.SchedulingConstraints = &CompositePodGroupSchedulingConstraints{}
}
if err := m.SchedulingConstraints.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -4876,6 +5309,56 @@ func (m *PriorityClassList) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *SingleCompositeDisruptionMode) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
preIndex := iNdEx
var wire uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
wire |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
return fmt.Errorf("proto: SingleCompositeDisruptionMode: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: SingleCompositeDisruptionMode: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthGenerated
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *SingleDisruptionMode) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0

View File

@@ -29,6 +29,11 @@ import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto";
// Package-wide variables from generator "generated".
option go_package = "k8s.io/api/scheduling/v1beta1";
// AllCompositeDisruptionMode means that children of a CompositePodGroup can only be
// disrupted or preempted together.
message AllCompositeDisruptionMode {
}
// AllDisruptionMode specifies that children can only be disrupted together.
message AllDisruptionMode {
}
@@ -43,6 +48,26 @@ message BasicSchedulingPolicy {
message CompositeBasicSchedulingPolicy {
}
// CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted.
// Exactly one mode must be set.
//
// +union
message CompositeDisruptionMode {
// single specifies that children groups can be disrupted independently from each other.
//
// +optional
// +k8s:optional
// +k8s:unionMember
optional SingleCompositeDisruptionMode single = 1;
// all specifies that all children groups can only be disrupted together.
//
// +optional
// +k8s:optional
// +k8s:unionMember
optional AllCompositeDisruptionMode all = 2;
}
// CompositeGangSchedulingPolicy indicates that the groups belonging to the composite group
// should be scheduled using all-or-nothing semantics.
message CompositeGangSchedulingPolicy {
@@ -109,6 +134,23 @@ message CompositePodGroupTemplate {
// +required
optional CompositePodGroupSchedulingPolicy schedulingPolicy = 2;
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositePodGroupSchedulingConstraints schedulingConstraints = 3;
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// One of Single, All.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositeDisruptionMode disruptionMode = 4;
// priorityClassName indicates the priority that should be considered when scheduling
// a composite pod group created from this template. If no priority class is specified,
// admission control can set this to the global default priority class if it exists.
@@ -120,7 +162,7 @@ message CompositePodGroupTemplate {
// +k8s:optional
// +k8s:format=k8s-long-name
// +k8s:immutable
optional string priorityClassName = 3;
optional string priorityClassName = 5;
// priority is the value of priority of composite pod groups created from this template.
// Various system components use this field to find the priority of the composite pod group.
@@ -133,7 +175,19 @@ message CompositePodGroupTemplate {
// +k8s:optional
// +k8s:maximum=1000000000 # HighestUserDefinablePriority
// +k8s:immutable
optional int32 priority = 4;
optional int32 priority = 6;
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
//
// +featureGate=PodGroupPreemptionPolicy
// +optional
// +k8s:immutable
// +k8s:ifDisabled("PodGroupPreemptionPolicy")=+k8s:forbidden
// +k8s:ifEnabled("PodGroupPreemptionPolicy")=+k8s:optional
optional string preemptionPolicy = 7;
// podGroupTemplates is the list of templates for children PodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
@@ -148,7 +202,7 @@ message CompositePodGroupTemplate {
// +k8s:maxItems=8
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
repeated PodGroupTemplate podGroupTemplates = 5;
repeated PodGroupTemplate podGroupTemplates = 8;
// compositePodGroupTemplates is the list of templates for children CompositePodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
@@ -163,15 +217,7 @@ message CompositePodGroupTemplate {
// +k8s:maxItems=8
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
repeated CompositePodGroupTemplate compositePodGroupTemplates = 6;
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
optional CompositePodGroupSchedulingConstraints schedulingConstraints = 7;
repeated CompositePodGroupTemplate compositePodGroupTemplates = 9;
}
// DisruptionMode defines how individual entities within a group can be disrupted.
@@ -668,6 +714,11 @@ message PriorityClassList {
repeated PriorityClass items = 2;
}
// SingleCompositeDisruptionMode means that individual children of a CompositePodGroup
// can be disrupted or preempted independently.
message SingleCompositeDisruptionMode {
}
// SingleDisruptionMode specifies that children can be disrupted independently.
message SingleDisruptionMode {
}

View File

@@ -315,6 +315,23 @@ type CompositePodGroupTemplate struct {
// +required
SchedulingPolicy CompositePodGroupSchedulingPolicy `json:"schedulingPolicy" protobuf:"bytes,2,opt,name=schedulingPolicy"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
SchedulingConstraints *CompositePodGroupSchedulingConstraints `json:"schedulingConstraints,omitempty" protobuf:"bytes,3,opt,name=schedulingConstraints"`
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// One of Single, All.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
DisruptionMode *CompositeDisruptionMode `json:"disruptionMode,omitempty" protobuf:"bytes,4,opt,name=disruptionMode"`
// priorityClassName indicates the priority that should be considered when scheduling
// a composite pod group created from this template. If no priority class is specified,
// admission control can set this to the global default priority class if it exists.
@@ -326,7 +343,7 @@ type CompositePodGroupTemplate struct {
// +k8s:optional
// +k8s:format=k8s-long-name
// +k8s:immutable
PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,3,opt,name=priorityClassName"`
PriorityClassName string `json:"priorityClassName,omitempty" protobuf:"bytes,5,opt,name=priorityClassName"`
// priority is the value of priority of composite pod groups created from this template.
// Various system components use this field to find the priority of the composite pod group.
@@ -339,7 +356,19 @@ type CompositePodGroupTemplate struct {
// +k8s:optional
// +k8s:maximum=1000000000 # HighestUserDefinablePriority
// +k8s:immutable
Priority *int32 `json:"priority,omitempty" protobuf:"varint,4,opt,name=priority"`
Priority *int32 `json:"priority,omitempty" protobuf:"varint,6,opt,name=priority"`
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
//
// +featureGate=PodGroupPreemptionPolicy
// +optional
// +k8s:immutable
// +k8s:ifDisabled("PodGroupPreemptionPolicy")=+k8s:forbidden
// +k8s:ifEnabled("PodGroupPreemptionPolicy")=+k8s:optional
PreemptionPolicy *PreemptionPolicy `json:"preemptionPolicy,omitempty" protobuf:"bytes,7,opt,name=preemptionPolicy"`
// podGroupTemplates is the list of templates for children PodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
@@ -354,7 +383,7 @@ type CompositePodGroupTemplate struct {
// +k8s:maxItems=8
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
PodGroupTemplates []PodGroupTemplate `json:"podGroupTemplates,omitempty" protobuf:"bytes,5,rep,name=podGroupTemplates"`
PodGroupTemplates []PodGroupTemplate `json:"podGroupTemplates,omitempty" protobuf:"bytes,8,rep,name=podGroupTemplates"`
// compositePodGroupTemplates is the list of templates for children CompositePodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
@@ -369,15 +398,7 @@ type CompositePodGroupTemplate struct {
// +k8s:maxItems=8
// +k8s:update=NoAddItem
// +k8s:update=NoRemoveItem
CompositePodGroupTemplates []CompositePodGroupTemplate `json:"compositePodGroupTemplates,omitempty" protobuf:"bytes,6,rep,name=compositePodGroupTemplates"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
//
// +optional
// +k8s:optional
// +k8s:immutable
SchedulingConstraints *CompositePodGroupSchedulingConstraints `json:"schedulingConstraints,omitempty" protobuf:"bytes,7,opt,name=schedulingConstraints"`
CompositePodGroupTemplates []CompositePodGroupTemplate `json:"compositePodGroupTemplates,omitempty" protobuf:"bytes,9,rep,name=compositePodGroupTemplates"`
}
// PodGroupSchedulingPolicy defines the scheduling configuration for a PodGroup.
@@ -882,6 +903,38 @@ type CompositeGangSchedulingPolicy struct {
MinGroupCount int32 `json:"minGroupCount" protobuf:"varint,1,req,name=minGroupCount"`
}
// CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted.
// Exactly one mode must be set.
//
// +union
type CompositeDisruptionMode struct {
// single specifies that children groups can be disrupted independently from each other.
//
// +optional
// +k8s:optional
// +k8s:unionMember
Single *SingleCompositeDisruptionMode `json:"single,omitempty" protobuf:"bytes,1,opt,name=single"`
// all specifies that all children groups can only be disrupted together.
//
// +optional
// +k8s:optional
// +k8s:unionMember
All *AllCompositeDisruptionMode `json:"all,omitempty" protobuf:"bytes,2,opt,name=all"`
}
// SingleCompositeDisruptionMode means that individual children of a CompositePodGroup
// can be disrupted or preempted independently.
type SingleCompositeDisruptionMode struct {
// This is intentionally empty.
}
// AllCompositeDisruptionMode means that children of a CompositePodGroup can only be
// disrupted or preempted together.
type AllCompositeDisruptionMode struct {
// This is intentionally empty.
}
// CompositePodGroupSchedulingConstraints defines scheduling constraints (e.g. topology) for a CompositePodGroup.
type CompositePodGroupSchedulingConstraints struct {
// topology defines the topology constraints for the composite pod group.

View File

@@ -27,6 +27,14 @@ package v1beta1
// Those methods can be generated by using hack/update-codegen.sh
// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT.
var map_AllCompositeDisruptionMode = map[string]string{
"": "AllCompositeDisruptionMode means that children of a CompositePodGroup can only be disrupted or preempted together.",
}
func (AllCompositeDisruptionMode) SwaggerDoc() map[string]string {
return map_AllCompositeDisruptionMode
}
var map_AllDisruptionMode = map[string]string{
"": "AllDisruptionMode specifies that children can only be disrupted together.",
}
@@ -51,6 +59,16 @@ func (CompositeBasicSchedulingPolicy) SwaggerDoc() map[string]string {
return map_CompositeBasicSchedulingPolicy
}
var map_CompositeDisruptionMode = map[string]string{
"": "CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted. Exactly one mode must be set.",
"single": "single specifies that children groups can be disrupted independently from each other.",
"all": "all specifies that all children groups can only be disrupted together.",
}
func (CompositeDisruptionMode) SwaggerDoc() map[string]string {
return map_CompositeDisruptionMode
}
var map_CompositeGangSchedulingPolicy = map[string]string{
"": "CompositeGangSchedulingPolicy indicates that the groups belonging to the composite group should be scheduled using all-or-nothing semantics.",
"minGroupCount": "minGroupCount is the minimum number of child groups that must be schedulable or scheduled at the same time for the scheduler to admit the entire group. It must be a positive integer.",
@@ -83,11 +101,13 @@ var map_CompositePodGroupTemplate = map[string]string{
"": "CompositePodGroupTemplate represents a template for a CompositePodGroup with a scheduling policy.",
"name": "name is a unique identifier for the CompositePodGroupTemplate within the Workload. It must be a DNS label. This field is required.",
"schedulingPolicy": "schedulingPolicy defines the scheduling policy for this template.",
"schedulingConstraints": "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate. This field is immutable.",
"disruptionMode": "disruptionMode defines the mode in which a given CompositePodGroup can be disrupted. One of Single, All. This field is immutable.",
"priorityClassName": "priorityClassName indicates the priority that should be considered when scheduling a composite pod group created from this template. If no priority class is specified, admission control can set this to the global default priority class if it exists. Otherwise, composite pod groups created from this template will have the priority set to zero. This field is immutable.",
"priority": "priority is the value of priority of composite pod groups created from this template. Various system components use this field to find the priority of the composite pod group. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. This field is immutable.",
"preemptionPolicy": "preemptionPolicy is the Policy for preempting pods/podgroups with lower priority. One of Never, PreemptLowerPriority. This field is immutable. This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.",
"podGroupTemplates": "podGroupTemplates is the list of templates for children PodGroups. The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates or PodGroupTemplates must be set.",
"compositePodGroupTemplates": "compositePodGroupTemplates is the list of templates for children CompositePodGroups. The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates or PodGroupTemplates must be set.",
"schedulingConstraints": "schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate. This field is immutable.",
}
func (CompositePodGroupTemplate) SwaggerDoc() map[string]string {
@@ -240,6 +260,14 @@ func (PriorityClassList) SwaggerDoc() map[string]string {
return map_PriorityClassList
}
var map_SingleCompositeDisruptionMode = map[string]string{
"": "SingleCompositeDisruptionMode means that individual children of a CompositePodGroup can be disrupted or preempted independently.",
}
func (SingleCompositeDisruptionMode) SwaggerDoc() map[string]string {
return map_SingleCompositeDisruptionMode
}
var map_SingleDisruptionMode = map[string]string{
"": "SingleDisruptionMode specifies that children can be disrupted independently.",
}

View File

@@ -27,6 +27,22 @@ import (
runtime "k8s.io/apimachinery/pkg/runtime"
)
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AllCompositeDisruptionMode) DeepCopyInto(out *AllCompositeDisruptionMode) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AllCompositeDisruptionMode.
func (in *AllCompositeDisruptionMode) DeepCopy() *AllCompositeDisruptionMode {
if in == nil {
return nil
}
out := new(AllCompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *AllDisruptionMode) DeepCopyInto(out *AllDisruptionMode) {
*out = *in
@@ -75,6 +91,32 @@ func (in *CompositeBasicSchedulingPolicy) DeepCopy() *CompositeBasicSchedulingPo
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CompositeDisruptionMode) DeepCopyInto(out *CompositeDisruptionMode) {
*out = *in
if in.Single != nil {
in, out := &in.Single, &out.Single
*out = new(SingleCompositeDisruptionMode)
**out = **in
}
if in.All != nil {
in, out := &in.All, &out.All
*out = new(AllCompositeDisruptionMode)
**out = **in
}
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new CompositeDisruptionMode.
func (in *CompositeDisruptionMode) DeepCopy() *CompositeDisruptionMode {
if in == nil {
return nil
}
out := new(CompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *CompositeGangSchedulingPolicy) DeepCopyInto(out *CompositeGangSchedulingPolicy) {
*out = *in
@@ -142,11 +184,26 @@ func (in *CompositePodGroupSchedulingPolicy) DeepCopy() *CompositePodGroupSchedu
func (in *CompositePodGroupTemplate) DeepCopyInto(out *CompositePodGroupTemplate) {
*out = *in
in.SchedulingPolicy.DeepCopyInto(&out.SchedulingPolicy)
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
}
if in.DisruptionMode != nil {
in, out := &in.DisruptionMode, &out.DisruptionMode
*out = new(CompositeDisruptionMode)
(*in).DeepCopyInto(*out)
}
if in.Priority != nil {
in, out := &in.Priority, &out.Priority
*out = new(int32)
**out = **in
}
if in.PreemptionPolicy != nil {
in, out := &in.PreemptionPolicy, &out.PreemptionPolicy
*out = new(PreemptionPolicy)
**out = **in
}
if in.PodGroupTemplates != nil {
in, out := &in.PodGroupTemplates, &out.PodGroupTemplates
*out = make([]PodGroupTemplate, len(*in))
@@ -161,11 +218,6 @@ func (in *CompositePodGroupTemplate) DeepCopyInto(out *CompositePodGroupTemplate
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
if in.SchedulingConstraints != nil {
in, out := &in.SchedulingConstraints, &out.SchedulingConstraints
*out = new(CompositePodGroupSchedulingConstraints)
(*in).DeepCopyInto(*out)
}
return
}
@@ -568,6 +620,22 @@ func (in *PriorityClassList) DeepCopyObject() runtime.Object {
return nil
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SingleCompositeDisruptionMode) DeepCopyInto(out *SingleCompositeDisruptionMode) {
*out = *in
return
}
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SingleCompositeDisruptionMode.
func (in *SingleCompositeDisruptionMode) DeepCopy() *SingleCompositeDisruptionMode {
if in == nil {
return nil
}
out := new(SingleCompositeDisruptionMode)
in.DeepCopyInto(out)
return out
}
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *SingleDisruptionMode) DeepCopyInto(out *SingleDisruptionMode) {
*out = *in

View File

@@ -21,6 +21,11 @@ limitations under the License.
package v1beta1
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in AllCompositeDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1beta1.AllCompositeDisruptionMode"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in AllDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1beta1.AllDisruptionMode"
@@ -36,6 +41,11 @@ func (in CompositeBasicSchedulingPolicy) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1beta1.CompositeBasicSchedulingPolicy"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in CompositeDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1beta1.CompositeDisruptionMode"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in CompositeGangSchedulingPolicy) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1beta1.CompositeGangSchedulingPolicy"
@@ -121,6 +131,11 @@ func (in PriorityClassList) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1beta1.PriorityClassList"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in SingleCompositeDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1beta1.SingleCompositeDisruptionMode"
}
// OpenAPIModelName returns the OpenAPI model name for this type.
func (in SingleDisruptionMode) OpenAPIModelName() string {
return "io.k8s.api.scheduling.v1beta1.SingleDisruptionMode"

View File

@@ -55,15 +55,20 @@
"minGroupCount": 1
}
},
"priorityClassName": "priorityClassNameValue",
"priority": 5,
"schedulingConstraints": {
"topology": [
{
"key": "keyValue"
}
]
}
},
"disruptionMode": {
"single": {},
"all": {}
},
"priorityClassName": "priorityClassNameValue",
"priority": 7,
"preemptionPolicy": "preemptionPolicyValue"
},
"status": {
"conditions": [

View File

@@ -33,8 +33,12 @@ metadata:
selfLink: selfLinkValue
uid: uidValue
spec:
disruptionMode:
all: {}
single: {}
parentCompositePodGroupName: parentCompositePodGroupNameValue
priority: 5
preemptionPolicy: preemptionPolicyValue
priority: 7
priorityClassName: priorityClassNameValue
schedulingConstraints:
topology:

View File

@@ -90,8 +90,20 @@
"minGroupCount": 1
}
},
"schedulingConstraints": {
"topology": [
{
"key": "keyValue"
}
]
},
"disruptionMode": {
"single": {},
"all": {}
},
"priorityClassName": "priorityClassNameValue",
"priority": 4,
"priority": 6,
"preemptionPolicy": "preemptionPolicyValue",
"podGroupTemplates": [
{
"name": "nameValue",
@@ -123,14 +135,7 @@
"priority": 7,
"preemptionPolicy": "preemptionPolicyValue"
}
],
"schedulingConstraints": {
"topology": [
{
"key": "keyValue"
}
]
}
]
}
]
}

View File

@@ -34,7 +34,10 @@ metadata:
uid: uidValue
spec:
compositePodGroupTemplates:
- name: nameValue
- disruptionMode:
all: {}
single: {}
name: nameValue
podGroupTemplates:
- disruptionMode:
all: {}
@@ -54,7 +57,8 @@ spec:
basic: {}
gang:
minCount: 1
priority: 4
preemptionPolicy: preemptionPolicyValue
priority: 6
priorityClassName: priorityClassNameValue
schedulingConstraints:
topology:

View File

@@ -90,8 +90,20 @@
"minGroupCount": 1
}
},
"schedulingConstraints": {
"topology": [
{
"key": "keyValue"
}
]
},
"disruptionMode": {
"single": {},
"all": {}
},
"priorityClassName": "priorityClassNameValue",
"priority": 4,
"priority": 6,
"preemptionPolicy": "preemptionPolicyValue",
"podGroupTemplates": [
{
"name": "nameValue",
@@ -123,14 +135,7 @@
"priority": 7,
"preemptionPolicy": "preemptionPolicyValue"
}
],
"schedulingConstraints": {
"topology": [
{
"key": "keyValue"
}
]
}
]
}
]
}

View File

@@ -34,7 +34,10 @@ metadata:
uid: uidValue
spec:
compositePodGroupTemplates:
- name: nameValue
- disruptionMode:
all: {}
single: {}
name: nameValue
podGroupTemplates:
- disruptionMode:
all: {}
@@ -54,7 +57,8 @@ spec:
basic: {}
gang:
minCount: 1
priority: 4
preemptionPolicy: preemptionPolicyValue
priority: 6
priorityClassName: priorityClassNameValue
schedulingConstraints:
topology:

View File

@@ -14947,6 +14947,18 @@ var schemaYAML = typed.YAMLObject(`types:
type:
scalar: numeric
default: 0
- name: io.k8s.api.scheduling.v1alpha3.AllCompositeDisruptionMode
map:
elementType:
scalar: untyped
list:
elementType:
namedType: __untyped_atomic_
elementRelationship: atomic
map:
elementType:
namedType: __untyped_deduced_
elementRelationship: separable
- name: io.k8s.api.scheduling.v1alpha3.AllDisruptionMode
map:
elementType:
@@ -14983,6 +14995,21 @@ var schemaYAML = typed.YAMLObject(`types:
elementType:
namedType: __untyped_deduced_
elementRelationship: separable
- name: io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode
map:
fields:
- name: all
type:
namedType: io.k8s.api.scheduling.v1alpha3.AllCompositeDisruptionMode
- name: single
type:
namedType: io.k8s.api.scheduling.v1alpha3.SingleCompositeDisruptionMode
unions:
- fields:
- fieldName: all
discriminatorValue: All
- fieldName: single
discriminatorValue: Single
- name: io.k8s.api.scheduling.v1alpha3.CompositeGangSchedulingPolicy
map:
fields:
@@ -15038,9 +15065,17 @@ var schemaYAML = typed.YAMLObject(`types:
- name: io.k8s.api.scheduling.v1alpha3.CompositePodGroupSpec
map:
fields:
- name: disruptionMode
type:
namedType: io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode
default:
single: {}
- name: parentCompositePodGroupName
type:
scalar: string
- name: preemptionPolicy
type:
scalar: string
- name: priority
type:
scalar: numeric
@@ -15079,6 +15114,9 @@ var schemaYAML = typed.YAMLObject(`types:
elementRelationship: associative
keys:
- name
- name: disruptionMode
type:
namedType: io.k8s.api.scheduling.v1alpha3.CompositeDisruptionMode
- name: name
type:
scalar: string
@@ -15091,6 +15129,9 @@ var schemaYAML = typed.YAMLObject(`types:
elementRelationship: associative
keys:
- name
- name: preemptionPolicy
type:
scalar: string
- name: priority
type:
scalar: numeric
@@ -15285,6 +15326,18 @@ var schemaYAML = typed.YAMLObject(`types:
type:
namedType: io.k8s.api.scheduling.v1alpha3.PodGroupSchedulingPolicy
default: {}
- name: io.k8s.api.scheduling.v1alpha3.SingleCompositeDisruptionMode
map:
elementType:
scalar: untyped
list:
elementType:
namedType: __untyped_atomic_
elementRelationship: atomic
map:
elementType:
namedType: __untyped_deduced_
elementRelationship: separable
- name: io.k8s.api.scheduling.v1alpha3.SingleDisruptionMode
map:
elementType:
@@ -15462,6 +15515,18 @@ var schemaYAML = typed.YAMLObject(`types:
elementRelationship: associative
keys:
- name
- name: io.k8s.api.scheduling.v1beta1.AllCompositeDisruptionMode
map:
elementType:
scalar: untyped
list:
elementType:
namedType: __untyped_atomic_
elementRelationship: atomic
map:
elementType:
namedType: __untyped_deduced_
elementRelationship: separable
- name: io.k8s.api.scheduling.v1beta1.AllDisruptionMode
map:
elementType:
@@ -15498,6 +15563,21 @@ var schemaYAML = typed.YAMLObject(`types:
elementType:
namedType: __untyped_deduced_
elementRelationship: separable
- name: io.k8s.api.scheduling.v1beta1.CompositeDisruptionMode
map:
fields:
- name: all
type:
namedType: io.k8s.api.scheduling.v1beta1.AllCompositeDisruptionMode
- name: single
type:
namedType: io.k8s.api.scheduling.v1beta1.SingleCompositeDisruptionMode
unions:
- fields:
- fieldName: all
discriminatorValue: All
- fieldName: single
discriminatorValue: Single
- name: io.k8s.api.scheduling.v1beta1.CompositeGangSchedulingPolicy
map:
fields:
@@ -15540,6 +15620,9 @@ var schemaYAML = typed.YAMLObject(`types:
elementRelationship: associative
keys:
- name
- name: disruptionMode
type:
namedType: io.k8s.api.scheduling.v1beta1.CompositeDisruptionMode
- name: name
type:
scalar: string
@@ -15552,6 +15635,9 @@ var schemaYAML = typed.YAMLObject(`types:
elementRelationship: associative
keys:
- name
- name: preemptionPolicy
type:
scalar: string
- name: priority
type:
scalar: numeric
@@ -15772,6 +15858,18 @@ var schemaYAML = typed.YAMLObject(`types:
type:
scalar: numeric
default: 0
- name: io.k8s.api.scheduling.v1beta1.SingleCompositeDisruptionMode
map:
elementType:
scalar: untyped
list:
elementType:
namedType: __untyped_atomic_
elementRelationship: atomic
map:
elementType:
namedType: __untyped_deduced_
elementRelationship: separable
- name: io.k8s.api.scheduling.v1beta1.SingleDisruptionMode
map:
elementType:

View File

@@ -0,0 +1,57 @@
/*
Copyright The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Code generated by applyconfiguration-gen. DO NOT EDIT.
package v1alpha3
import (
schedulingv1alpha3 "k8s.io/api/scheduling/v1alpha3"
)
// CompositeDisruptionModeApplyConfiguration represents a declarative configuration of the CompositeDisruptionMode type for use
// with apply.
//
// CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted.
// Exactly one mode must be set.
type CompositeDisruptionModeApplyConfiguration struct {
// single specifies that children groups can be disrupted independently from each other.
Single *schedulingv1alpha3.SingleCompositeDisruptionMode `json:"single,omitempty"`
// all specifies that all children groups can only be disrupted together.
All *schedulingv1alpha3.AllCompositeDisruptionMode `json:"all,omitempty"`
}
// CompositeDisruptionModeApplyConfiguration constructs a declarative configuration of the CompositeDisruptionMode type for use with
// apply.
func CompositeDisruptionMode() *CompositeDisruptionModeApplyConfiguration {
return &CompositeDisruptionModeApplyConfiguration{}
}
// WithSingle sets the Single field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the Single field is set to the value of the last call.
func (b *CompositeDisruptionModeApplyConfiguration) WithSingle(value schedulingv1alpha3.SingleCompositeDisruptionMode) *CompositeDisruptionModeApplyConfiguration {
b.Single = &value
return b
}
// WithAll sets the All field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the All field is set to the value of the last call.
func (b *CompositeDisruptionModeApplyConfiguration) WithAll(value schedulingv1alpha3.AllCompositeDisruptionMode) *CompositeDisruptionModeApplyConfiguration {
b.All = &value
return b
}

View File

@@ -18,6 +18,10 @@ limitations under the License.
package v1alpha3
import (
schedulingv1alpha3 "k8s.io/api/scheduling/v1alpha3"
)
// CompositePodGroupSpecApplyConfiguration represents a declarative configuration of the CompositePodGroupSpec type for use
// with apply.
//
@@ -37,6 +41,15 @@ type CompositePodGroupSpecApplyConfiguration struct {
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// This field is immutable.
SchedulingPolicy *CompositePodGroupSchedulingPolicyApplyConfiguration `json:"schedulingPolicy,omitempty"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// This field is immutable.
SchedulingConstraints *CompositePodGroupSchedulingConstraintsApplyConfiguration `json:"schedulingConstraints,omitempty"`
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// One of Single, All. Defaults to Single if unset.
// This field is immutable.
DisruptionMode *CompositeDisruptionModeApplyConfiguration `json:"disruptionMode,omitempty"`
// priorityClassName defines the priority that should be considered when scheduling this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// If left unspecified, it is validated and resolved similarly to the PriorityClassName field in Pods
@@ -51,10 +64,13 @@ type CompositePodGroupSpecApplyConfiguration struct {
// The higher the value, the higher the priority.
// This field is immutable.
Priority *int32 `json:"priority,omitempty"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroup.
// Controllers are expected to fill this field by copying it from a CompositePodGroupTemplate.
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset.
// When Priority Admission Controller is enabled, it populates this field from PriorityClassName,
// and defaults to PreemptLowerPriority if value is unset in PriorityClass.
// This field is immutable.
SchedulingConstraints *CompositePodGroupSchedulingConstraintsApplyConfiguration `json:"schedulingConstraints,omitempty"`
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
PreemptionPolicy *schedulingv1alpha3.PreemptionPolicy `json:"preemptionPolicy,omitempty"`
}
// CompositePodGroupSpecApplyConfiguration constructs a declarative configuration of the CompositePodGroupSpec type for use with
@@ -87,6 +103,22 @@ func (b *CompositePodGroupSpecApplyConfiguration) WithSchedulingPolicy(value *Co
return b
}
// WithSchedulingConstraints sets the SchedulingConstraints field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the SchedulingConstraints field is set to the value of the last call.
func (b *CompositePodGroupSpecApplyConfiguration) WithSchedulingConstraints(value *CompositePodGroupSchedulingConstraintsApplyConfiguration) *CompositePodGroupSpecApplyConfiguration {
b.SchedulingConstraints = value
return b
}
// WithDisruptionMode sets the DisruptionMode field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the DisruptionMode field is set to the value of the last call.
func (b *CompositePodGroupSpecApplyConfiguration) WithDisruptionMode(value *CompositeDisruptionModeApplyConfiguration) *CompositePodGroupSpecApplyConfiguration {
b.DisruptionMode = value
return b
}
// WithPriorityClassName sets the PriorityClassName field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the PriorityClassName field is set to the value of the last call.
@@ -103,10 +135,10 @@ func (b *CompositePodGroupSpecApplyConfiguration) WithPriority(value int32) *Com
return b
}
// WithSchedulingConstraints sets the SchedulingConstraints field in the declarative configuration to the given value
// WithPreemptionPolicy sets the PreemptionPolicy field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the SchedulingConstraints field is set to the value of the last call.
func (b *CompositePodGroupSpecApplyConfiguration) WithSchedulingConstraints(value *CompositePodGroupSchedulingConstraintsApplyConfiguration) *CompositePodGroupSpecApplyConfiguration {
b.SchedulingConstraints = value
// If called multiple times, the PreemptionPolicy field is set to the value of the last call.
func (b *CompositePodGroupSpecApplyConfiguration) WithPreemptionPolicy(value schedulingv1alpha3.PreemptionPolicy) *CompositePodGroupSpecApplyConfiguration {
b.PreemptionPolicy = &value
return b
}

View File

@@ -18,6 +18,10 @@ limitations under the License.
package v1alpha3
import (
schedulingv1alpha3 "k8s.io/api/scheduling/v1alpha3"
)
// CompositePodGroupTemplateApplyConfiguration represents a declarative configuration of the CompositePodGroupTemplate type for use
// with apply.
//
@@ -28,6 +32,13 @@ type CompositePodGroupTemplateApplyConfiguration struct {
Name *string `json:"name,omitempty"`
// schedulingPolicy defines the scheduling policy for this template.
SchedulingPolicy *CompositePodGroupSchedulingPolicyApplyConfiguration `json:"schedulingPolicy,omitempty"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
SchedulingConstraints *CompositePodGroupSchedulingConstraintsApplyConfiguration `json:"schedulingConstraints,omitempty"`
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// One of Single, All.
// This field is immutable.
DisruptionMode *CompositeDisruptionModeApplyConfiguration `json:"disruptionMode,omitempty"`
// priorityClassName indicates the priority that should be considered when scheduling
// a composite pod group created from this template. If no priority class is specified,
// admission control can set this to the global default priority class if it exists.
@@ -42,6 +53,11 @@ type CompositePodGroupTemplateApplyConfiguration struct {
// The higher the value, the higher the priority.
// This field is immutable.
Priority *int32 `json:"priority,omitempty"`
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
PreemptionPolicy *schedulingv1alpha3.PreemptionPolicy `json:"preemptionPolicy,omitempty"`
// podGroupTemplates is the list of templates for children PodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
// or PodGroupTemplates must be set.
@@ -50,9 +66,6 @@ type CompositePodGroupTemplateApplyConfiguration struct {
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
// or PodGroupTemplates must be set.
CompositePodGroupTemplates []CompositePodGroupTemplateApplyConfiguration `json:"compositePodGroupTemplates,omitempty"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
SchedulingConstraints *CompositePodGroupSchedulingConstraintsApplyConfiguration `json:"schedulingConstraints,omitempty"`
}
// CompositePodGroupTemplateApplyConfiguration constructs a declarative configuration of the CompositePodGroupTemplate type for use with
@@ -77,6 +90,22 @@ func (b *CompositePodGroupTemplateApplyConfiguration) WithSchedulingPolicy(value
return b
}
// WithSchedulingConstraints sets the SchedulingConstraints field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the SchedulingConstraints field is set to the value of the last call.
func (b *CompositePodGroupTemplateApplyConfiguration) WithSchedulingConstraints(value *CompositePodGroupSchedulingConstraintsApplyConfiguration) *CompositePodGroupTemplateApplyConfiguration {
b.SchedulingConstraints = value
return b
}
// WithDisruptionMode sets the DisruptionMode field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the DisruptionMode field is set to the value of the last call.
func (b *CompositePodGroupTemplateApplyConfiguration) WithDisruptionMode(value *CompositeDisruptionModeApplyConfiguration) *CompositePodGroupTemplateApplyConfiguration {
b.DisruptionMode = value
return b
}
// WithPriorityClassName sets the PriorityClassName field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the PriorityClassName field is set to the value of the last call.
@@ -93,6 +122,14 @@ func (b *CompositePodGroupTemplateApplyConfiguration) WithPriority(value int32)
return b
}
// WithPreemptionPolicy sets the PreemptionPolicy field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the PreemptionPolicy field is set to the value of the last call.
func (b *CompositePodGroupTemplateApplyConfiguration) WithPreemptionPolicy(value schedulingv1alpha3.PreemptionPolicy) *CompositePodGroupTemplateApplyConfiguration {
b.PreemptionPolicy = &value
return b
}
// WithPodGroupTemplates adds the given value to the PodGroupTemplates field in the declarative configuration
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
// If called multiple times, values provided by each call will be appended to the PodGroupTemplates field.
@@ -118,11 +155,3 @@ func (b *CompositePodGroupTemplateApplyConfiguration) WithCompositePodGroupTempl
}
return b
}
// WithSchedulingConstraints sets the SchedulingConstraints field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the SchedulingConstraints field is set to the value of the last call.
func (b *CompositePodGroupTemplateApplyConfiguration) WithSchedulingConstraints(value *CompositePodGroupSchedulingConstraintsApplyConfiguration) *CompositePodGroupTemplateApplyConfiguration {
b.SchedulingConstraints = value
return b
}

View File

@@ -0,0 +1,57 @@
/*
Copyright The Kubernetes Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Code generated by applyconfiguration-gen. DO NOT EDIT.
package v1beta1
import (
schedulingv1beta1 "k8s.io/api/scheduling/v1beta1"
)
// CompositeDisruptionModeApplyConfiguration represents a declarative configuration of the CompositeDisruptionMode type for use
// with apply.
//
// CompositeDisruptionMode defines how individual entities within a composite pod group can be disrupted.
// Exactly one mode must be set.
type CompositeDisruptionModeApplyConfiguration struct {
// single specifies that children groups can be disrupted independently from each other.
Single *schedulingv1beta1.SingleCompositeDisruptionMode `json:"single,omitempty"`
// all specifies that all children groups can only be disrupted together.
All *schedulingv1beta1.AllCompositeDisruptionMode `json:"all,omitempty"`
}
// CompositeDisruptionModeApplyConfiguration constructs a declarative configuration of the CompositeDisruptionMode type for use with
// apply.
func CompositeDisruptionMode() *CompositeDisruptionModeApplyConfiguration {
return &CompositeDisruptionModeApplyConfiguration{}
}
// WithSingle sets the Single field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the Single field is set to the value of the last call.
func (b *CompositeDisruptionModeApplyConfiguration) WithSingle(value schedulingv1beta1.SingleCompositeDisruptionMode) *CompositeDisruptionModeApplyConfiguration {
b.Single = &value
return b
}
// WithAll sets the All field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the All field is set to the value of the last call.
func (b *CompositeDisruptionModeApplyConfiguration) WithAll(value schedulingv1beta1.AllCompositeDisruptionMode) *CompositeDisruptionModeApplyConfiguration {
b.All = &value
return b
}

View File

@@ -18,6 +18,10 @@ limitations under the License.
package v1beta1
import (
schedulingv1beta1 "k8s.io/api/scheduling/v1beta1"
)
// CompositePodGroupTemplateApplyConfiguration represents a declarative configuration of the CompositePodGroupTemplate type for use
// with apply.
//
@@ -28,6 +32,13 @@ type CompositePodGroupTemplateApplyConfiguration struct {
Name *string `json:"name,omitempty"`
// schedulingPolicy defines the scheduling policy for this template.
SchedulingPolicy *CompositePodGroupSchedulingPolicyApplyConfiguration `json:"schedulingPolicy,omitempty"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
SchedulingConstraints *CompositePodGroupSchedulingConstraintsApplyConfiguration `json:"schedulingConstraints,omitempty"`
// disruptionMode defines the mode in which a given CompositePodGroup can be disrupted.
// One of Single, All.
// This field is immutable.
DisruptionMode *CompositeDisruptionModeApplyConfiguration `json:"disruptionMode,omitempty"`
// priorityClassName indicates the priority that should be considered when scheduling
// a composite pod group created from this template. If no priority class is specified,
// admission control can set this to the global default priority class if it exists.
@@ -42,6 +53,11 @@ type CompositePodGroupTemplateApplyConfiguration struct {
// The higher the value, the higher the priority.
// This field is immutable.
Priority *int32 `json:"priority,omitempty"`
// preemptionPolicy is the Policy for preempting pods/podgroups with lower priority.
// One of Never, PreemptLowerPriority.
// This field is immutable.
// This field is available only when the PodGroupPreemptionPolicy feature gate is enabled.
PreemptionPolicy *schedulingv1beta1.PreemptionPolicy `json:"preemptionPolicy,omitempty"`
// podGroupTemplates is the list of templates for children PodGroups.
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
// or PodGroupTemplates must be set.
@@ -50,9 +66,6 @@ type CompositePodGroupTemplateApplyConfiguration struct {
// The maximum number of templates is 8. At least one entry in CompositePodGroupTemplates
// or PodGroupTemplates must be set.
CompositePodGroupTemplates []CompositePodGroupTemplateApplyConfiguration `json:"compositePodGroupTemplates,omitempty"`
// schedulingConstraints defines optional scheduling constraints (e.g. topology) for this CompositePodGroupTemplate.
// This field is immutable.
SchedulingConstraints *CompositePodGroupSchedulingConstraintsApplyConfiguration `json:"schedulingConstraints,omitempty"`
}
// CompositePodGroupTemplateApplyConfiguration constructs a declarative configuration of the CompositePodGroupTemplate type for use with
@@ -77,6 +90,22 @@ func (b *CompositePodGroupTemplateApplyConfiguration) WithSchedulingPolicy(value
return b
}
// WithSchedulingConstraints sets the SchedulingConstraints field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the SchedulingConstraints field is set to the value of the last call.
func (b *CompositePodGroupTemplateApplyConfiguration) WithSchedulingConstraints(value *CompositePodGroupSchedulingConstraintsApplyConfiguration) *CompositePodGroupTemplateApplyConfiguration {
b.SchedulingConstraints = value
return b
}
// WithDisruptionMode sets the DisruptionMode field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the DisruptionMode field is set to the value of the last call.
func (b *CompositePodGroupTemplateApplyConfiguration) WithDisruptionMode(value *CompositeDisruptionModeApplyConfiguration) *CompositePodGroupTemplateApplyConfiguration {
b.DisruptionMode = value
return b
}
// WithPriorityClassName sets the PriorityClassName field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the PriorityClassName field is set to the value of the last call.
@@ -93,6 +122,14 @@ func (b *CompositePodGroupTemplateApplyConfiguration) WithPriority(value int32)
return b
}
// WithPreemptionPolicy sets the PreemptionPolicy field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the PreemptionPolicy field is set to the value of the last call.
func (b *CompositePodGroupTemplateApplyConfiguration) WithPreemptionPolicy(value schedulingv1beta1.PreemptionPolicy) *CompositePodGroupTemplateApplyConfiguration {
b.PreemptionPolicy = &value
return b
}
// WithPodGroupTemplates adds the given value to the PodGroupTemplates field in the declarative configuration
// and returns the receiver, so that objects can be build by chaining "With" function invocations.
// If called multiple times, values provided by each call will be appended to the PodGroupTemplates field.
@@ -118,11 +155,3 @@ func (b *CompositePodGroupTemplateApplyConfiguration) WithCompositePodGroupTempl
}
return b
}
// WithSchedulingConstraints sets the SchedulingConstraints field in the declarative configuration to the given value
// and returns the receiver, so that objects can be built by chaining "With" function invocations.
// If called multiple times, the SchedulingConstraints field is set to the value of the last call.
func (b *CompositePodGroupTemplateApplyConfiguration) WithSchedulingConstraints(value *CompositePodGroupSchedulingConstraintsApplyConfiguration) *CompositePodGroupTemplateApplyConfiguration {
b.SchedulingConstraints = value
return b
}

View File

@@ -1866,6 +1866,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
return &applyconfigurationsschedulingv1.PriorityClassApplyConfiguration{}
// Group=scheduling.k8s.io, Version=v1alpha3
case schedulingv1alpha3.SchemeGroupVersion.WithKind("CompositeDisruptionMode"):
return &applyconfigurationsschedulingv1alpha3.CompositeDisruptionModeApplyConfiguration{}
case schedulingv1alpha3.SchemeGroupVersion.WithKind("CompositeGangSchedulingPolicy"):
return &applyconfigurationsschedulingv1alpha3.CompositeGangSchedulingPolicyApplyConfiguration{}
case schedulingv1alpha3.SchemeGroupVersion.WithKind("CompositePodGroup"):
@@ -1922,6 +1924,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} {
return &applyconfigurationsschedulingv1alpha3.WorkloadSpecApplyConfiguration{}
// Group=scheduling.k8s.io, Version=v1beta1
case schedulingv1beta1.SchemeGroupVersion.WithKind("CompositeDisruptionMode"):
return &applyconfigurationsschedulingv1beta1.CompositeDisruptionModeApplyConfiguration{}
case schedulingv1beta1.SchemeGroupVersion.WithKind("CompositeGangSchedulingPolicy"):
return &applyconfigurationsschedulingv1beta1.CompositeGangSchedulingPolicyApplyConfiguration{}
case schedulingv1beta1.SchemeGroupVersion.WithKind("CompositePodGroupSchedulingConstraints"):

View File

@@ -56,8 +56,9 @@ func testDeclarativeValidate(t *testing.T, apiVersion string) {
strategy := registry.NewStrategy()
testCases := map[string]struct {
input scheduling.CompositePodGroup
expectedErrs field.ErrorList
input scheduling.CompositePodGroup
enablePodGroupPreemptionPolicy bool
expectedErrs field.ErrorList
}{
"valid": {
input: mkValidCompositePodGroup(),
@@ -142,6 +143,40 @@ func testDeclarativeValidate(t *testing.T, apiVersion string) {
input: mkValidCompositePodGroup(addTopologyConstraint("Example.com/Foo")),
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec", "schedulingConstraints", "topology").Index(0).Child("key"), nil, "").WithOrigin("format=k8s-label-key")},
},
"composite pod group disruption mode all": {
input: mkValidCompositePodGroup(setDisruptionModeAll()),
},
"disruption mode with neither single nor all": {
input: mkValidCompositePodGroup(setDisruptionModeNeither()),
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec", "disruptionMode"), nil, "").WithOrigin("union")},
},
"disruption mode with both single and all": {
input: mkValidCompositePodGroup(setDisruptionModeBoth()),
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec", "disruptionMode"), nil, "").WithOrigin("union")},
},
"composite pod group without disruption mode": {
input: mkValidCompositePodGroup(clearDisruptionMode()),
expectedErrs: field.ErrorList{field.Required(field.NewPath("spec", "disruptionMode"), "")},
},
"preemption policy set, PodGroupPreemptionPolicy disabled": {
input: mkValidCompositePodGroup(setPreemptionPolicy(scheduling.PreemptNever)),
expectedErrs: field.ErrorList{field.Forbidden(field.NewPath("spec", "preemptionPolicy"), "")},
},
"valid preemption policy (Never), PodGroupPreemptionPolicy enabled": {
input: mkValidCompositePodGroup(setPreemptionPolicy(scheduling.PreemptNever)),
enablePodGroupPreemptionPolicy: true,
},
"invalid preemption policy, PodGroupPreemptionPolicy enabled": {
input: mkValidCompositePodGroup(setPreemptionPolicy(scheduling.PreemptionPolicy("Invalid"))),
enablePodGroupPreemptionPolicy: true,
expectedErrs: field.ErrorList{
field.NotSupported(field.NewPath("spec", "preemptionPolicy"), scheduling.PreemptionPolicy("Invalid"), []string{"Never", "PreemptLowerPriority"}),
},
},
"composite pod group without preemption policy, PodGroupPreemptionPolicy enabled": {
input: mkValidCompositePodGroup(clearPreemptionPolicy()),
enablePodGroupPreemptionPolicy: true,
},
}
for k, tc := range testCases {
@@ -150,6 +185,7 @@ func testDeclarativeValidate(t *testing.T, apiVersion string) {
features.GenericWorkload: true,
features.CompositePodGroup: true,
features.TopologyAwareWorkloadScheduling: true,
features.PodGroupPreemptionPolicy: tc.enablePodGroupPreemptionPolicy,
})
apitesting.VerifyValidationEquivalence(t, ctx, &tc.input, strategy, tc.expectedErrs)
})
@@ -179,9 +215,10 @@ func testDeclarativeValidateUpdate(t *testing.T, apiVersion string) {
})
testCases := map[string]struct {
oldObj scheduling.CompositePodGroup
updateObj scheduling.CompositePodGroup
expectedErrs field.ErrorList
oldObj scheduling.CompositePodGroup
updateObj scheduling.CompositePodGroup
enablePodGroupPreemptionPolicy bool
expectedErrs field.ErrorList
}{
"valid update": {
oldObj: mkValidCompositePodGroup(setResourceVersion("1")),
@@ -256,6 +293,38 @@ func testDeclarativeValidateUpdate(t *testing.T, apiVersion string) {
updateObj: mkValidCompositePodGroup(setResourceVersion("1"), addTopologyConstraint("bar")),
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec", "schedulingConstraints"), nil, "field is immutable").WithOrigin("immutable")},
},
"invalid update of disruption mode": {
oldObj: mkValidCompositePodGroup(setResourceVersion("1")),
updateObj: mkValidCompositePodGroup(setResourceVersion("1"), setDisruptionModeAll()),
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec", "disruptionMode"), &scheduling.CompositeDisruptionMode{All: &scheduling.AllCompositeDisruptionMode{}}, "field is immutable").WithOrigin("immutable")},
},
"valid update with unchanged PreemptionPolicy": {
oldObj: mkValidCompositePodGroup(setResourceVersion("1"), setPreemptionPolicy(scheduling.PreemptLowerPriority)),
updateObj: mkValidCompositePodGroup(setResourceVersion("1"), setPreemptionPolicy(scheduling.PreemptLowerPriority)),
enablePodGroupPreemptionPolicy: true,
},
"invalid update of PreemptionPolicy": {
oldObj: mkValidCompositePodGroup(setResourceVersion("1"), setPreemptionPolicy(scheduling.PreemptLowerPriority)),
updateObj: mkValidCompositePodGroup(setResourceVersion("1"), setPreemptionPolicy(scheduling.PreemptNever)),
enablePodGroupPreemptionPolicy: true,
expectedErrs: field.ErrorList{
field.Invalid(field.NewPath("spec", "preemptionPolicy"), nil, "").WithOrigin("immutable"),
},
},
"valid update with unchanged PreemptionPolicy when PodGroupPreemptionPolicy is disabled": {
oldObj: mkValidCompositePodGroup(setResourceVersion("1"), setPreemptionPolicy(scheduling.PreemptLowerPriority)),
updateObj: mkValidCompositePodGroup(setResourceVersion("1"), setPreemptionPolicy(scheduling.PreemptLowerPriority)),
enablePodGroupPreemptionPolicy: false,
},
"invalid update of PreemptionPolicy when PodGroupPreemptionPolicy is disabled": {
oldObj: mkValidCompositePodGroup(setResourceVersion("1"), setPreemptionPolicy(scheduling.PreemptLowerPriority)),
updateObj: mkValidCompositePodGroup(setResourceVersion("1"), setPreemptionPolicy(scheduling.PreemptNever)),
enablePodGroupPreemptionPolicy: false,
expectedErrs: field.ErrorList{
field.Forbidden(field.NewPath("spec", "preemptionPolicy"), ""),
field.Invalid(field.NewPath("spec", "preemptionPolicy"), nil, "").WithOrigin("immutable"),
},
},
}
for k, tc := range testCases {
@@ -264,6 +333,7 @@ func testDeclarativeValidateUpdate(t *testing.T, apiVersion string) {
features.GenericWorkload: true,
features.CompositePodGroup: true,
features.TopologyAwareWorkloadScheduling: true,
features.PodGroupPreemptionPolicy: tc.enablePodGroupPreemptionPolicy,
})
strategy := registry.NewStrategy()
apitesting.VerifyUpdateValidationEquivalence(t, ctx, &tc.updateObj, &tc.oldObj, strategy, tc.expectedErrs)
@@ -353,6 +423,9 @@ func mkValidCompositePodGroup(tweaks ...func(cpg *scheduling.CompositePodGroup))
SchedulingPolicy: scheduling.CompositePodGroupSchedulingPolicy{
Basic: &scheduling.CompositeBasicSchedulingPolicy{},
},
DisruptionMode: &scheduling.CompositeDisruptionMode{
Single: &scheduling.SingleCompositeDisruptionMode{},
},
},
}
for _, tweak := range tweaks {
@@ -373,6 +446,47 @@ func setParentCompositePodGroupName(name string) func(obj *scheduling.CompositeP
}
}
func setDisruptionModeAll() func(obj *scheduling.CompositePodGroup) {
return func(obj *scheduling.CompositePodGroup) {
obj.Spec.DisruptionMode = &scheduling.CompositeDisruptionMode{
All: &scheduling.AllCompositeDisruptionMode{},
}
}
}
func setDisruptionModeNeither() func(obj *scheduling.CompositePodGroup) {
return func(obj *scheduling.CompositePodGroup) {
obj.Spec.DisruptionMode = &scheduling.CompositeDisruptionMode{}
}
}
func setDisruptionModeBoth() func(obj *scheduling.CompositePodGroup) {
return func(obj *scheduling.CompositePodGroup) {
obj.Spec.DisruptionMode = &scheduling.CompositeDisruptionMode{
Single: &scheduling.SingleCompositeDisruptionMode{},
All: &scheduling.AllCompositeDisruptionMode{},
}
}
}
func clearDisruptionMode() func(obj *scheduling.CompositePodGroup) {
return func(obj *scheduling.CompositePodGroup) {
obj.Spec.DisruptionMode = nil
}
}
func setPreemptionPolicy(policy scheduling.PreemptionPolicy) func(obj *scheduling.CompositePodGroup) {
return func(obj *scheduling.CompositePodGroup) {
obj.Spec.PreemptionPolicy = &policy
}
}
func clearPreemptionPolicy() func(obj *scheduling.CompositePodGroup) {
return func(obj *scheduling.CompositePodGroup) {
obj.Spec.PreemptionPolicy = nil
}
}
func setPriority(priority int32) func(obj *scheduling.CompositePodGroup) {
return func(obj *scheduling.CompositePodGroup) {
obj.Spec.Priority = &priority

View File

@@ -61,10 +61,20 @@ func init() {
"metadata.uid": {
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
},
"spec.disruptionMode": {
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueInvalid", Origin: "union"},
{ErrorType: "FieldValueRequired"},
},
"spec.parentCompositePodGroupName": {
{ErrorType: "FieldValueInvalid", Origin: "format=k8s-long-name"},
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
},
"spec.preemptionPolicy": {
{ErrorType: "FieldValueForbidden"},
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueNotSupported"},
},
"spec.priority": {
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueInvalid", Origin: "maximum"},

View File

@@ -429,6 +429,28 @@ func testDeclarativeValidate(t *testing.T, apiVersion string) {
field.Invalid(field.NewPath("spec"), nil, "detected multiple priority configurations").MarkFromImperative(),
},
},
"cpg disruption mode single": {
input: mkValidWorkload(setCPGDisruptionModeSingle(0)),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
},
"cpg disruption mode all": {
input: mkValidWorkload(setCPGDisruptionModeAll(0)),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
},
"cpg disruption mode with neither single nor all": {
input: mkValidWorkload(setCPGDisruptionModeNeither(0)),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("disruptionMode"), nil, "").WithOrigin("union")},
},
"cpg disruption mode with both single and all": {
input: mkValidWorkload(setCPGDisruptionModeBoth(0)),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("disruptionMode"), nil, "").WithOrigin("union")},
},
"cpg policy missing gang": {
input: mkValidWorkload(setCPGPolicyEmpty(0)),
enableCompositePodGroup: true,
@@ -734,6 +756,30 @@ func testDeclarativeValidate(t *testing.T, apiVersion string) {
enableCompositePodGroup: true,
expectedErrs: field.ErrorList{field.Invalid(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("schedulingConstraints", "topology").Index(0).Child("key"), nil, "").WithOrigin("format=k8s-label-key")},
},
"valid cpg PreemptionPolicy": {
input: mkValidWorkload(setCPGPreemptionPolicy(0, scheduling.PreemptLowerPriority)),
enableTopologyAwareScheduling: true,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: true,
},
"invalid cpg PreemptionPolicy": {
input: mkValidWorkload(setCPGPreemptionPolicy(0, scheduling.PreemptionPolicy("Invalid"))),
enableTopologyAwareScheduling: true,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: true,
expectedErrs: field.ErrorList{
field.NotSupported(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("preemptionPolicy"), scheduling.PreemptionPolicy("Invalid"), []string{"Never", "PreemptLowerPriority"}),
},
},
"forbidden cpg PreemptionPolicy when PodGroupPreemptionPolicy is disabled": {
input: mkValidWorkload(setCPGPreemptionPolicy(0, scheduling.PreemptLowerPriority)),
enableTopologyAwareScheduling: true,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: false,
expectedErrs: field.ErrorList{
field.Forbidden(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("preemptionPolicy"), ""),
},
},
}
for k, tc := range testCases {
t.Run(k, func(t *testing.T) {
@@ -1137,6 +1183,15 @@ func testDeclarativeValidateUpdate(t *testing.T, apiVersion string) {
field.Forbidden(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("podGroupTemplates").Index(1), "").WithOrigin("update"),
},
},
"invalid update immutable cpg disruptionMode": {
oldObj: mkValidWorkload(setResourceVersion("1"), setCPGDisruptionModeSingle(0)),
updateObj: mkValidWorkload(setResourceVersion("1"), setCPGDisruptionModeAll(0)),
enableCompositePodGroup: true,
enableTopologyAwareScheduling: true,
expectedErrs: field.ErrorList{
field.Invalid(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("disruptionMode"), nil, "field is immutable").WithOrigin("immutable"),
},
},
"invalid update immutable nested pg disruptionMode": {
oldObj: mkValidWorkload(setResourceVersion("1"), addCompositePodGroupTemplate(), setNestedPGDisruptionModeSingle(0, 0)),
updateObj: mkValidWorkload(setResourceVersion("1"), addCompositePodGroupTemplate(), setNestedPGDisruptionModeAll(0, 0)),
@@ -1293,6 +1348,41 @@ func testDeclarativeValidateUpdate(t *testing.T, apiVersion string) {
field.Invalid(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("schedulingConstraints"), nil, "field is immutable").WithOrigin("immutable"),
},
},
"valid update with unchanged cpg PreemptionPolicy": {
oldObj: mkValidWorkload(setResourceVersion("1"), setCPGPreemptionPolicy(0, scheduling.PreemptLowerPriority)),
updateObj: mkValidWorkload(setResourceVersion("1"), setCPGPreemptionPolicy(0, scheduling.PreemptLowerPriority)),
enableTopologyAwareScheduling: true,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: true,
},
"invalid update of cpg PreemptionPolicy": {
oldObj: mkValidWorkload(setResourceVersion("1"), setCPGPreemptionPolicy(0, scheduling.PreemptLowerPriority)),
updateObj: mkValidWorkload(setResourceVersion("1"), setCPGPreemptionPolicy(0, scheduling.PreemptNever)),
enableTopologyAwareScheduling: true,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: true,
expectedErrs: field.ErrorList{
field.Invalid(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("preemptionPolicy"), nil, "").WithOrigin("immutable"),
},
},
"valid update with unchanged cpg PreemptionPolicy when PodGroupPreemptionPolicy is disabled": {
oldObj: mkValidWorkload(setResourceVersion("1"), setCPGPreemptionPolicy(0, scheduling.PreemptLowerPriority)),
updateObj: mkValidWorkload(setResourceVersion("1"), setCPGPreemptionPolicy(0, scheduling.PreemptLowerPriority)),
enableTopologyAwareScheduling: true,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: false,
},
"invalid update of cpg PreemptionPolicy when PodGroupPreemptionPolicy is disabled": {
oldObj: mkValidWorkload(setResourceVersion("1"), setCPGPreemptionPolicy(0, scheduling.PreemptLowerPriority)),
updateObj: mkValidWorkload(setResourceVersion("1"), setCPGPreemptionPolicy(0, scheduling.PreemptNever)),
enableTopologyAwareScheduling: true,
enableCompositePodGroup: true,
enablePodGroupPreemptionPolicy: false,
expectedErrs: field.ErrorList{
field.Forbidden(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("preemptionPolicy"), ""),
field.Invalid(field.NewPath("spec", "compositePodGroupTemplates").Index(0).Child("preemptionPolicy"), nil, "").WithOrigin("immutable"),
},
},
}
ctx := genericapirequest.WithRequestInfo(genericapirequest.NewDefaultContext(), &genericapirequest.RequestInfo{
APIPrefix: "apis",
@@ -1629,6 +1719,41 @@ func addNestedCompositePodGroupTemplate(idx int, names ...string) func(obj *sche
}
}
func setCPGDisruptionModeSingle(idx int) func(obj *scheduling.Workload) {
return func(obj *scheduling.Workload) {
addCompositePodGroupTemplate()(obj)
obj.Spec.CompositePodGroupTemplates[idx].DisruptionMode = &scheduling.CompositeDisruptionMode{
Single: &scheduling.SingleCompositeDisruptionMode{},
}
}
}
func setCPGDisruptionModeAll(idx int) func(obj *scheduling.Workload) {
return func(obj *scheduling.Workload) {
addCompositePodGroupTemplate()(obj)
obj.Spec.CompositePodGroupTemplates[idx].DisruptionMode = &scheduling.CompositeDisruptionMode{
All: &scheduling.AllCompositeDisruptionMode{},
}
}
}
func setCPGDisruptionModeNeither(idx int) func(obj *scheduling.Workload) {
return func(obj *scheduling.Workload) {
addCompositePodGroupTemplate()(obj)
obj.Spec.CompositePodGroupTemplates[idx].DisruptionMode = &scheduling.CompositeDisruptionMode{}
}
}
func setCPGDisruptionModeBoth(idx int) func(obj *scheduling.Workload) {
return func(obj *scheduling.Workload) {
addCompositePodGroupTemplate()(obj)
obj.Spec.CompositePodGroupTemplates[idx].DisruptionMode = &scheduling.CompositeDisruptionMode{
Single: &scheduling.SingleCompositeDisruptionMode{},
All: &scheduling.AllCompositeDisruptionMode{},
}
}
}
func setCPGPriorityClassName(idx int, priorityClassName string) func(obj *scheduling.Workload) {
return func(obj *scheduling.Workload) {
addCompositePodGroupTemplate()(obj)
@@ -1966,3 +2091,10 @@ func addCPGTopologyConstraint(cpgIdx int, topologyKey string) func(obj *scheduli
scheduling.TopologyConstraint{Key: topologyKey})
}
}
func setCPGPreemptionPolicy(cidx int, policy scheduling.PreemptionPolicy) func(obj *scheduling.Workload) {
return func(obj *scheduling.Workload) {
addCompositePodGroupTemplate()(obj)
obj.Spec.CompositePodGroupTemplates[cidx].PreemptionPolicy = &policy
}
}

View File

@@ -81,6 +81,10 @@ func init() {
{ErrorType: "FieldValueDuplicate"},
{ErrorType: "FieldValueForbidden", Origin: "update"},
},
"spec.compositePodGroupTemplates[*].disruptionMode": {
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueInvalid", Origin: "union"},
},
"spec.compositePodGroupTemplates[*].name": {
{ErrorType: "FieldValueInvalid", Origin: "format=k8s-short-name"},
{ErrorType: "FieldValueRequired"},
@@ -156,6 +160,11 @@ func init() {
{ErrorType: "FieldValueInvalid", Origin: "minimum"},
{ErrorType: "FieldValueRequired"},
},
"spec.compositePodGroupTemplates[*].preemptionPolicy": {
{ErrorType: "FieldValueForbidden"},
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueNotSupported"},
},
"spec.compositePodGroupTemplates[*].priority": {
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueInvalid", Origin: "maximum"},

View File

@@ -81,6 +81,10 @@ func init() {
{ErrorType: "FieldValueDuplicate"},
{ErrorType: "FieldValueForbidden", Origin: "update"},
},
"spec.compositePodGroupTemplates[*].disruptionMode": {
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueInvalid", Origin: "union"},
},
"spec.compositePodGroupTemplates[*].name": {
{ErrorType: "FieldValueInvalid", Origin: "format=k8s-short-name"},
{ErrorType: "FieldValueRequired"},
@@ -156,6 +160,11 @@ func init() {
{ErrorType: "FieldValueInvalid", Origin: "minimum"},
{ErrorType: "FieldValueRequired"},
},
"spec.compositePodGroupTemplates[*].preemptionPolicy": {
{ErrorType: "FieldValueForbidden"},
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueNotSupported"},
},
"spec.compositePodGroupTemplates[*].priority": {
{ErrorType: "FieldValueInvalid", Origin: "immutable"},
{ErrorType: "FieldValueInvalid", Origin: "maximum"},