From b75e665a7d9c256d75706635e428e1aabeb8ba5f Mon Sep 17 00:00:00 2001 From: helayoty Date: Thu, 27 Nov 2025 01:25:02 +0000 Subject: [PATCH] Add +k8s:minimum validation tag --- .../scheduling/v1alpha1/zz_generated.validations.go | 1 + pkg/apis/scheduling/validation/validation.go | 12 +++++++++++- .../k8s.io/api/scheduling/v1alpha1/generated.proto | 1 + staging/src/k8s.io/api/scheduling/v1alpha1/types.go | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/apis/scheduling/v1alpha1/zz_generated.validations.go b/pkg/apis/scheduling/v1alpha1/zz_generated.validations.go index 1e225985ac8..a6728ff21c8 100644 --- a/pkg/apis/scheduling/v1alpha1/zz_generated.validations.go +++ b/pkg/apis/scheduling/v1alpha1/zz_generated.validations.go @@ -77,6 +77,7 @@ func Validate_GangSchedulingPolicy(ctx context.Context, op operation.Operation, if earlyReturn { return // do not proceed } + errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...) return }(fldPath.Child("minCount"), &obj.MinCount, safe.Field(oldObj, func(oldObj *schedulingv1alpha1.GangSchedulingPolicy) *int32 { return &oldObj.MinCount }), oldObj != nil)...) diff --git a/pkg/apis/scheduling/validation/validation.go b/pkg/apis/scheduling/validation/validation.go index 6ca22364544..b9ecce42b29 100644 --- a/pkg/apis/scheduling/validation/validation.go +++ b/pkg/apis/scheduling/validation/validation.go @@ -161,7 +161,17 @@ func validatBasicSchedulingPolicy(policy *scheduling.BasicSchedulingPolicy, fldP } func validateGangSchedulingPolicy(policy *scheduling.GangSchedulingPolicy, fldPath *field.Path) field.ErrorList { - allErrs := apivalidation.ValidatePositiveField(int64(policy.MinCount), fldPath.Child("minCount")) + // To match the declarative validation behavior, we return Required for 0. + // Declarative validation treats 0 as "missing" via validate.RequiredValue() + // and returns early before checking the minimum constraint. + // For non-zero values, declarative validation returns early without any validation, + // so we don't mark them as covered. + var allErrs field.ErrorList + if policy.MinCount == 0 { + allErrs = append(allErrs, field.Required(fldPath.Child("minCount"), "").MarkCoveredByDeclarative()) + } else if policy.MinCount < 0 { + allErrs = append(allErrs, apivalidation.ValidatePositiveField(int64(policy.MinCount), fldPath.Child("minCount")).WithOrigin("minimum").MarkCoveredByDeclarative()...) + } return allErrs } diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/generated.proto b/staging/src/k8s.io/api/scheduling/v1alpha1/generated.proto index b69875c1022..7f0e37d27e3 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/generated.proto +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/generated.proto @@ -42,6 +42,7 @@ message GangSchedulingPolicy { // // +required // +k8s:required + // +k8s:minimum=0 optional int32 minCount = 1; } diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/types.go b/staging/src/k8s.io/api/scheduling/v1alpha1/types.go index 28131d8d904..890542320af 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/types.go +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/types.go @@ -213,5 +213,6 @@ type GangSchedulingPolicy struct { // // +required // +k8s:required + // +k8s:minimum=0 MinCount int32 `json:"minCount" protobuf:"varint,1,opt,name=minCount"` }