diff --git a/pkg/scheduler/apis/config/validation/validation_pluginargs.go b/pkg/scheduler/apis/config/validation/validation_pluginargs.go index e3797dc8734..4d234ba2dc6 100644 --- a/pkg/scheduler/apis/config/validation/validation_pluginargs.go +++ b/pkg/scheduler/apis/config/validation/validation_pluginargs.go @@ -317,9 +317,17 @@ func ValidateNodeResourcesFitArgs(path *field.Path, args *config.NodeResourcesFi allErrs = append(allErrs, field.NotSupported(strategyPath.Child("type"), args.ScoringStrategy.Type, sets.List(supportedScoringStrategyTypes))) } allErrs = append(allErrs, validateResources(args.ScoringStrategy.Resources, strategyPath.Child("resources"))...) - if args.ScoringStrategy.RequestedToCapacityRatio != nil { - allErrs = append(allErrs, validateFunctionShape(args.ScoringStrategy.RequestedToCapacityRatio.Shape, strategyPath.Child("shape"))...) + if args.ScoringStrategy.Type == config.RequestedToCapacityRatio { + if args.ScoringStrategy.RequestedToCapacityRatio == nil { + allErrs = append(allErrs, field.Required(strategyPath.Child("requestedToCapacityRatio"), "must be specified when type is RequestedToCapacityRatio")) + } else { + allErrs = append(allErrs, validateFunctionShape(args.ScoringStrategy.RequestedToCapacityRatio.Shape, strategyPath.Child("requestedToCapacityRatio").Child("shape"))...) + } + } else if args.ScoringStrategy.RequestedToCapacityRatio != nil { + allErrs = append(allErrs, field.Forbidden(strategyPath.Child("requestedToCapacityRatio"), "must be nil when type is not RequestedToCapacityRatio")) } + } else { + allErrs = append(allErrs, field.Required(strategyPath, "ScoringStrategy field is required")) } if len(allErrs) == 0 { diff --git a/pkg/scheduler/apis/config/validation/validation_pluginargs_test.go b/pkg/scheduler/apis/config/validation/validation_pluginargs_test.go index e452575fa8e..6bc9ddb4075 100644 --- a/pkg/scheduler/apis/config/validation/validation_pluginargs_test.go +++ b/pkg/scheduler/apis/config/validation/validation_pluginargs_test.go @@ -754,12 +754,28 @@ func TestValidateFitArgs(t *testing.T) { }, expect: `Unsupported value: "Invalid"`, }, + { + name: "ScoringStrategy: requestedToCapacityRatio field is missing", + args: config.NodeResourcesFitArgs{ + ScoringStrategy: &config.ScoringStrategy{ + Type: config.RequestedToCapacityRatio, + }, + }, + expect: "must be specified when type is RequestedToCapacityRatio", + }, } for _, test := range argsTest { t.Run(test.name, func(t *testing.T) { - if err := ValidateNodeResourcesFitArgs(nil, &test.args); err != nil && (!strings.Contains(err.Error(), test.expect)) { - t.Errorf("case[%v]: error details do not include %v", test.name, err) + err := ValidateNodeResourcesFitArgs(nil, &test.args) + if err != nil { + if test.expect == "" { + t.Errorf("case[%v]: unexpected validation error %v", test.name, err) + } else if !strings.Contains(err.Error(), test.expect) { + t.Errorf("case[%v]: error details do not include %v", test.name, err) + } + } else if test.expect != "" { + t.Errorf("case[%v]: expected validation error", test.name) } }) } @@ -974,7 +990,7 @@ func TestValidateRequestedToCapacityRatioScoringStrategy(t *testing.T) { wantErrs: field.ErrorList{ { Type: field.ErrorTypeRequired, - Field: "scoringStrategy.shape", + Field: "scoringStrategy.requestedToCapacityRatio.shape", }, }, }, @@ -1026,7 +1042,7 @@ func TestValidateRequestedToCapacityRatioScoringStrategy(t *testing.T) { wantErrs: field.ErrorList{ { Type: field.ErrorTypeInvalid, - Field: "scoringStrategy.shape[0].utilization", + Field: "scoringStrategy.requestedToCapacityRatio.shape[0].utilization", }, }, }, @@ -1041,7 +1057,7 @@ func TestValidateRequestedToCapacityRatioScoringStrategy(t *testing.T) { wantErrs: field.ErrorList{ { Type: field.ErrorTypeInvalid, - Field: "scoringStrategy.shape[0].utilization", + Field: "scoringStrategy.requestedToCapacityRatio.shape[0].utilization", }, }, }, @@ -1060,7 +1076,7 @@ func TestValidateRequestedToCapacityRatioScoringStrategy(t *testing.T) { wantErrs: field.ErrorList{ { Type: field.ErrorTypeInvalid, - Field: "scoringStrategy.shape[1].utilization", + Field: "scoringStrategy.requestedToCapacityRatio.shape[1].utilization", }, }, }, @@ -1101,7 +1117,7 @@ func TestValidateRequestedToCapacityRatioScoringStrategy(t *testing.T) { wantErrs: field.ErrorList{ { Type: field.ErrorTypeInvalid, - Field: "scoringStrategy.shape[2].utilization", + Field: "scoringStrategy.requestedToCapacityRatio.shape[2].utilization", }, }, }, @@ -1116,7 +1132,7 @@ func TestValidateRequestedToCapacityRatioScoringStrategy(t *testing.T) { wantErrs: field.ErrorList{ { Type: field.ErrorTypeInvalid, - Field: "scoringStrategy.shape[0].score", + Field: "scoringStrategy.requestedToCapacityRatio.shape[0].score", }, }, }, @@ -1131,7 +1147,7 @@ func TestValidateRequestedToCapacityRatioScoringStrategy(t *testing.T) { wantErrs: field.ErrorList{ { Type: field.ErrorTypeInvalid, - Field: "scoringStrategy.shape[0].score", + Field: "scoringStrategy.requestedToCapacityRatio.shape[0].score", }, }, },