From 5296650c1cadaa406f9a1e7662a5795825e2421c Mon Sep 17 00:00:00 2001 From: Mike Dame Date: Tue, 15 Oct 2019 13:33:22 -0400 Subject: [PATCH] Add Scheduler validation check for redeclared plugin configs --- pkg/scheduler/api/validation/validation.go | 50 ++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/pkg/scheduler/api/validation/validation.go b/pkg/scheduler/api/validation/validation.go index d2836510b0b..37367f1946c 100644 --- a/pkg/scheduler/api/validation/validation.go +++ b/pkg/scheduler/api/validation/validation.go @@ -34,10 +34,18 @@ import ( func ValidatePolicy(policy schedulerapi.Policy) error { var validationErrors []error + priorities := make(map[string]schedulerapi.PriorityPolicy, len(policy.Priorities)) for _, priority := range policy.Priorities { if priority.Weight <= 0 || priority.Weight >= framework.MaxWeight { validationErrors = append(validationErrors, fmt.Errorf("Priority %s should have a positive weight applied to it or it has overflown", priority.Name)) } + + validationErrors = append(validationErrors, validatePriorityRedeclared(priorities, priority)) + } + + predicates := make(map[string]schedulerapi.PredicatePolicy, len(policy.Predicates)) + for _, predicate := range policy.Predicates { + validationErrors = append(validationErrors, validatePredicateRedeclared(predicates, predicate)) } binders := 0 @@ -66,6 +74,48 @@ func ValidatePolicy(policy schedulerapi.Policy) error { return utilerrors.NewAggregate(validationErrors) } +// validatePriorityRedeclared checks if any custom priorities have been declared multiple times in the policy config +// by examining the specified priority arguments +func validatePriorityRedeclared(priorities map[string]schedulerapi.PriorityPolicy, priority schedulerapi.PriorityPolicy) error { + var priorityType string + if priority.Argument != nil { + if priority.Argument.LabelPreference != nil { + priorityType = "LabelPreference" + } else if priority.Argument.RequestedToCapacityRatioArguments != nil { + priorityType = "RequestedToCapacityRatioArguments" + } else if priority.Argument.ServiceAntiAffinity != nil { + priorityType = "ServiceAntiAffinity" + } else { + return fmt.Errorf("No priority arguments set for priority %s", priority.Name) + } + if existing, alreadyDeclared := priorities[priorityType]; alreadyDeclared { + return fmt.Errorf("Priority %s is redeclared (was %+v)", priority.Name, existing) + } + priorities[priorityType] = priority + } + return nil +} + +// validatePredicateRedeclared checks if any custom predicates have been declared multiple times in the policy config +// by examining the specified predicate arguments +func validatePredicateRedeclared(predicates map[string]schedulerapi.PredicatePolicy, predicate schedulerapi.PredicatePolicy) error { + var predicateType string + if predicate.Argument != nil { + if predicate.Argument.LabelsPresence != nil { + predicateType = "LabelsPresence" + } else if predicate.Argument.ServiceAffinity != nil { + predicateType = "ServiceAffinity" + } else { + return fmt.Errorf("No priority arguments set for priority %s", predicate.Name) + } + if existing, alreadyDeclared := predicates[predicateType]; alreadyDeclared { + return fmt.Errorf("Priority %s is redeclared (was %+v)", predicate.Name, existing) + } + predicates[predicateType] = predicate + } + return nil +} + // validateExtendedResourceName checks whether the specified name is a valid // extended resource name. func validateExtendedResourceName(name v1.ResourceName) []error {