mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-10-03 09:06:26 +00:00
EvenPodsSpread: api changes
This commit is contained in:
@@ -3091,6 +3091,7 @@ func ValidatePodSpec(spec *core.PodSpec, fldPath *field.Path) field.ErrorList {
|
||||
allErrs = append(allErrs, validateAffinity(spec.Affinity, fldPath.Child("affinity"))...)
|
||||
allErrs = append(allErrs, validatePodDNSConfig(spec.DNSConfig, &spec.DNSPolicy, fldPath.Child("dnsConfig"))...)
|
||||
allErrs = append(allErrs, validateReadinessGates(spec.ReadinessGates, fldPath.Child("readinessGates"))...)
|
||||
allErrs = append(allErrs, validateTopologySpreadConstraints(spec.TopologySpreadConstraints, fldPath.Child("topologySpreadConstraints"))...)
|
||||
if len(spec.ServiceAccountName) > 0 {
|
||||
for _, msg := range ValidateServiceAccountName(spec.ServiceAccountName, false) {
|
||||
allErrs = append(allErrs, field.Invalid(fldPath.Child("serviceAccountName"), spec.ServiceAccountName, msg))
|
||||
@@ -5561,3 +5562,78 @@ func ValidateProcMountType(fldPath *field.Path, procMountType core.ProcMountType
|
||||
return field.NotSupported(fldPath, procMountType, []string{string(core.DefaultProcMount), string(core.UnmaskedProcMount)})
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
supportedScheduleActions = sets.NewString(string(core.DoNotSchedule), string(core.ScheduleAnyway))
|
||||
)
|
||||
|
||||
type spreadConstraintPair struct {
|
||||
topologyKey string
|
||||
whenUnsatisfiable core.UnsatisfiableConstraintAction
|
||||
}
|
||||
|
||||
// validateTopologySpreadConstraints validates given TopologySpreadConstraints.
|
||||
func validateTopologySpreadConstraints(constraints []core.TopologySpreadConstraint, fldPath *field.Path) field.ErrorList {
|
||||
allErrs := field.ErrorList{}
|
||||
|
||||
var existingConstraintPairs []spreadConstraintPair
|
||||
for i, constraint := range constraints {
|
||||
subFldPath := fldPath.Index(i)
|
||||
if err := ValidateMaxSkew(subFldPath.Child("maxSkew"), constraint.MaxSkew); err != nil {
|
||||
allErrs = append(allErrs, err)
|
||||
}
|
||||
if err := ValidateTopologyKey(subFldPath.Child("topologyKey"), constraint.TopologyKey); err != nil {
|
||||
allErrs = append(allErrs, err)
|
||||
}
|
||||
if err := ValidateWhenUnsatisfiable(subFldPath.Child("whenUnsatisfiable"), constraint.WhenUnsatisfiable); err != nil {
|
||||
allErrs = append(allErrs, err)
|
||||
}
|
||||
// tuple {topologyKey, whenUnsatisfiable} denotes one kind of spread constraint
|
||||
pair := spreadConstraintPair{
|
||||
topologyKey: constraint.TopologyKey,
|
||||
whenUnsatisfiable: constraint.WhenUnsatisfiable,
|
||||
}
|
||||
if err := ValidateSpreadConstraintPair(subFldPath.Child("{topologyKey, whenUnsatisfiable}"), pair, existingConstraintPairs); err != nil {
|
||||
allErrs = append(allErrs, err)
|
||||
} else {
|
||||
existingConstraintPairs = append(existingConstraintPairs, pair)
|
||||
}
|
||||
}
|
||||
|
||||
return allErrs
|
||||
}
|
||||
|
||||
// ValidateMaxSkew tests that the argument is a valid MaxSkew.
|
||||
func ValidateMaxSkew(fldPath *field.Path, maxSkew int32) *field.Error {
|
||||
if maxSkew <= 0 {
|
||||
return field.Invalid(fldPath, maxSkew, isNotPositiveErrorMsg)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ValidateTopologyKey tests that the argument is a valid TopologyKey.
|
||||
func ValidateTopologyKey(fldPath *field.Path, topologyKey string) *field.Error {
|
||||
if len(topologyKey) == 0 {
|
||||
return field.Required(fldPath, "can not be empty")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ValidateWhenUnsatisfiable tests that the argument is a valid UnsatisfiableConstraintAction.
|
||||
func ValidateWhenUnsatisfiable(fldPath *field.Path, action core.UnsatisfiableConstraintAction) *field.Error {
|
||||
if !supportedScheduleActions.Has(string(action)) {
|
||||
return field.NotSupported(fldPath, action, supportedScheduleActions.List())
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ValidateSpreadConstraintPair tests that if `pair` exists in `existingConstraintPairs`.
|
||||
func ValidateSpreadConstraintPair(fldPath *field.Path, pair spreadConstraintPair, existingConstraintPairs []spreadConstraintPair) *field.Error {
|
||||
for _, existingPair := range existingConstraintPairs {
|
||||
if pair.topologyKey == existingPair.topologyKey &&
|
||||
pair.whenUnsatisfiable == existingPair.whenUnsatisfiable {
|
||||
return field.Duplicate(fldPath, pair)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user