Merge pull request #80395 from Huang-Wei/cleanup-eps-validation

Optimize logic in EvenPodsSpread API validation
This commit is contained in:
Kubernetes Prow Robot 2019-08-07 20:09:41 -07:00 committed by GitHub
commit 6c0c167829
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -5698,16 +5698,10 @@ 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 {
@ -5720,14 +5714,8 @@ func validateTopologySpreadConstraints(constraints []core.TopologySpreadConstrai
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 {
if err := ValidateSpreadConstraintNotRepeat(subFldPath.Child("{topologyKey, whenUnsatisfiable}"), constraint, constraints[i+1:]); err != nil {
allErrs = append(allErrs, err)
} else {
existingConstraintPairs = append(existingConstraintPairs, pair)
}
}
@ -5758,12 +5746,13 @@ func ValidateWhenUnsatisfiable(fldPath *field.Path, action core.UnsatisfiableCon
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)
// ValidateSpreadConstraintNotRepeat tests that if `constraint` duplicates with `existingConstraintPairs`
// on TopologyKey and WhenUnsatisfiable fields.
func ValidateSpreadConstraintNotRepeat(fldPath *field.Path, constraint core.TopologySpreadConstraint, restingConstraints []core.TopologySpreadConstraint) *field.Error {
for _, restingConstraint := range restingConstraints {
if constraint.TopologyKey == restingConstraint.TopologyKey &&
constraint.WhenUnsatisfiable == restingConstraint.WhenUnsatisfiable {
return field.Duplicate(fldPath, fmt.Sprintf("{%v, %v}", constraint.TopologyKey, constraint.WhenUnsatisfiable))
}
}
return nil