Skip to content

Commit b19f478

Browse files
committed
Validate custom priority policy config.
- Do not validate redeclartion of custom predicates. - Validate no duplicate declaration of RequestedToCapacityRatio - Validate the weights across multiple declarations of LabelPreference/ServiceAntiAffinity are the same.
1 parent 6a19261 commit b19f478

File tree

2 files changed

+50
-47
lines changed

2 files changed

+50
-47
lines changed

pkg/scheduler/apis/config/validation/validation.go

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,7 @@ func ValidatePolicy(policy config.Policy) error {
8989
if priority.Weight <= 0 || priority.Weight >= config.MaxWeight {
9090
validationErrors = append(validationErrors, fmt.Errorf("Priority %s should have a positive weight applied to it or it has overflown", priority.Name))
9191
}
92-
93-
validationErrors = append(validationErrors, validatePriorityRedeclared(priorities, priority))
94-
}
95-
96-
predicates := make(map[string]config.PredicatePolicy, len(policy.Predicates))
97-
for _, predicate := range policy.Predicates {
98-
validationErrors = append(validationErrors, validatePredicateRedeclared(predicates, predicate))
92+
validationErrors = append(validationErrors, validateCustomPriorities(priorities, priority))
9993
}
10094

10195
binders := 0
@@ -124,44 +118,43 @@ func ValidatePolicy(policy config.Policy) error {
124118
return utilerrors.NewAggregate(validationErrors)
125119
}
126120

127-
// validatePriorityRedeclared checks if any custom priorities have been declared multiple times in the policy config
128-
// by examining the specified priority arguments
129-
func validatePriorityRedeclared(priorities map[string]config.PriorityPolicy, priority config.PriorityPolicy) error {
130-
var priorityType string
131-
if priority.Argument != nil {
132-
if priority.Argument.LabelPreference != nil {
133-
priorityType = "LabelPreference"
134-
} else if priority.Argument.RequestedToCapacityRatioArguments != nil {
135-
priorityType = "RequestedToCapacityRatioArguments"
136-
} else if priority.Argument.ServiceAntiAffinity != nil {
137-
priorityType = "ServiceAntiAffinity"
138-
} else {
139-
return fmt.Errorf("No priority arguments set for priority %s", priority.Name)
121+
// validateCustomPriorities validates that:
122+
// 1. RequestedToCapacityRatioRedeclared custom priority cannot be declared multiple times,
123+
// 2. LabelPreference/ServiceAntiAffinity custom priorities can be declared multiple times,
124+
// however the weights for each custom priority type should be the same.
125+
func validateCustomPriorities(priorities map[string]config.PriorityPolicy, priority config.PriorityPolicy) error {
126+
verifyRedeclaration := func(priorityType string) error {
127+
if existing, alreadyDeclared := priorities[priorityType]; alreadyDeclared {
128+
return fmt.Errorf("Priority %q redeclares custom priority %q, from:%q", priority.Name, priorityType, existing.Name)
140129
}
130+
priorities[priorityType] = priority
131+
return nil
132+
}
133+
verifyDifferentWeights := func(priorityType string) error {
141134
if existing, alreadyDeclared := priorities[priorityType]; alreadyDeclared {
142-
return fmt.Errorf("Priority '%s' redeclares custom priority '%s', from:'%s'", priority.Name, priorityType, existing.Name)
135+
if existing.Weight != priority.Weight {
136+
return fmt.Errorf("%s priority %q has a different weight with %q", priorityType, priority.Name, existing.Name)
137+
}
143138
}
144139
priorities[priorityType] = priority
140+
return nil
145141
}
146-
return nil
147-
}
148-
149-
// validatePredicateRedeclared checks if any custom predicates have been declared multiple times in the policy config
150-
// by examining the specified predicate arguments
151-
func validatePredicateRedeclared(predicates map[string]config.PredicatePolicy, predicate config.PredicatePolicy) error {
152-
var predicateType string
153-
if predicate.Argument != nil {
154-
if predicate.Argument.LabelsPresence != nil {
155-
predicateType = "LabelsPresence"
156-
} else if predicate.Argument.ServiceAffinity != nil {
157-
predicateType = "ServiceAffinity"
142+
if priority.Argument != nil {
143+
if priority.Argument.LabelPreference != nil {
144+
if err := verifyDifferentWeights("LabelPreference"); err != nil {
145+
return err
146+
}
147+
} else if priority.Argument.ServiceAntiAffinity != nil {
148+
if err := verifyDifferentWeights("ServiceAntiAffinity"); err != nil {
149+
return err
150+
}
151+
} else if priority.Argument.RequestedToCapacityRatioArguments != nil {
152+
if err := verifyRedeclaration("RequestedToCapacityRatio"); err != nil {
153+
return err
154+
}
158155
} else {
159-
return fmt.Errorf("No priority arguments set for priority %s", predicate.Name)
160-
}
161-
if existing, alreadyDeclared := predicates[predicateType]; alreadyDeclared {
162-
return fmt.Errorf("Predicate '%s' redeclares custom predicate '%s', from:'%s'", predicate.Name, predicateType, existing.Name)
156+
return fmt.Errorf("No priority arguments set for priority %s", priority.Name)
163157
}
164-
predicates[predicateType] = predicate
165158
}
166159
return nil
167160
}

pkg/scheduler/apis/config/validation/validation_test.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -240,24 +240,34 @@ func TestValidatePolicy(t *testing.T) {
240240
expected: errors.New("kubernetes.io/foo is an invalid extended resource name"),
241241
},
242242
{
243-
name: "invalid redeclared custom predicate",
243+
name: "invalid redeclared RequestedToCapacityRatio custom priority",
244244
policy: config.Policy{
245-
Predicates: []config.PredicatePolicy{
246-
{Name: "customPredicate1", Argument: &config.PredicateArgument{ServiceAffinity: &config.ServiceAffinity{Labels: []string{"label1"}}}},
247-
{Name: "customPredicate2", Argument: &config.PredicateArgument{ServiceAffinity: &config.ServiceAffinity{Labels: []string{"label2"}}}},
245+
Priorities: []config.PriorityPolicy{
246+
{Name: "customPriority1", Weight: 1, Argument: &config.PriorityArgument{RequestedToCapacityRatioArguments: &config.RequestedToCapacityRatioArguments{}}},
247+
{Name: "customPriority2", Weight: 1, Argument: &config.PriorityArgument{RequestedToCapacityRatioArguments: &config.RequestedToCapacityRatioArguments{}}},
248+
},
249+
},
250+
expected: errors.New("Priority \"customPriority2\" redeclares custom priority \"RequestedToCapacityRatio\", from:\"customPriority1\""),
251+
},
252+
{
253+
name: "different weights for LabelPreference custom priority",
254+
policy: config.Policy{
255+
Priorities: []config.PriorityPolicy{
256+
{Name: "customPriority1", Weight: 1, Argument: &config.PriorityArgument{LabelPreference: &config.LabelPreference{}}},
257+
{Name: "customPriority2", Weight: 2, Argument: &config.PriorityArgument{LabelPreference: &config.LabelPreference{}}},
248258
},
249259
},
250-
expected: errors.New("Predicate 'customPredicate2' redeclares custom predicate 'ServiceAffinity', from:'customPredicate1'"),
260+
expected: errors.New("LabelPreference priority \"customPriority2\" has a different weight with \"customPriority1\""),
251261
},
252262
{
253-
name: "invalid redeclared custom priority",
263+
name: "different weights for ServiceAntiAffinity custom priority",
254264
policy: config.Policy{
255265
Priorities: []config.PriorityPolicy{
256-
{Name: "customPriority1", Weight: 1, Argument: &config.PriorityArgument{ServiceAntiAffinity: &config.ServiceAntiAffinity{Label: "label1"}}},
257-
{Name: "customPriority2", Weight: 1, Argument: &config.PriorityArgument{ServiceAntiAffinity: &config.ServiceAntiAffinity{Label: "label2"}}},
266+
{Name: "customPriority1", Weight: 1, Argument: &config.PriorityArgument{ServiceAntiAffinity: &config.ServiceAntiAffinity{}}},
267+
{Name: "customPriority2", Weight: 2, Argument: &config.PriorityArgument{ServiceAntiAffinity: &config.ServiceAntiAffinity{}}},
258268
},
259269
},
260-
expected: errors.New("Priority 'customPriority2' redeclares custom priority 'ServiceAntiAffinity', from:'customPriority1'"),
270+
expected: errors.New("ServiceAntiAffinity priority \"customPriority2\" has a different weight with \"customPriority1\""),
261271
},
262272
}
263273

0 commit comments

Comments
 (0)