From ce6ea2f4b0fe28c59b10196b9ee40f08d661c3bb Mon Sep 17 00:00:00 2001 From: darshansreenivas Date: Sat, 6 Dec 2025 11:02:19 -0800 Subject: [PATCH] adding required and other test cases --- pkg/apis/node/v1/zz_generated.validations.go | 4 +++ .../node/v1alpha1/zz_generated.validations.go | 4 +++ .../node/v1beta1/zz_generated.validations.go | 4 +++ pkg/apis/node/validation/validation.go | 9 ++++-- .../declarative_validation_test.go | 28 ++++++++++++++++++- .../src/k8s.io/api/node/v1/generated.proto | 2 ++ staging/src/k8s.io/api/node/v1/types.go | 2 ++ .../k8s.io/api/node/v1alpha1/generated.proto | 2 ++ staging/src/k8s.io/api/node/v1alpha1/types.go | 2 ++ .../k8s.io/api/node/v1beta1/generated.proto | 2 ++ staging/src/k8s.io/api/node/v1beta1/types.go | 2 ++ 11 files changed, 57 insertions(+), 4 deletions(-) diff --git a/pkg/apis/node/v1/zz_generated.validations.go b/pkg/apis/node/v1/zz_generated.validations.go index dba4eab5c07..7943168159a 100644 --- a/pkg/apis/node/v1/zz_generated.validations.go +++ b/pkg/apis/node/v1/zz_generated.validations.go @@ -77,6 +77,10 @@ func Validate_RuntimeClass(ctx context.Context, op operation.Operation, fldPath errs = append(errs, e...) earlyReturn = true } + if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } if earlyReturn { return // do not proceed } diff --git a/pkg/apis/node/v1alpha1/zz_generated.validations.go b/pkg/apis/node/v1alpha1/zz_generated.validations.go index e7cd3b07184..c53378e84da 100644 --- a/pkg/apis/node/v1alpha1/zz_generated.validations.go +++ b/pkg/apis/node/v1alpha1/zz_generated.validations.go @@ -116,6 +116,10 @@ func Validate_RuntimeClassSpec(ctx context.Context, op operation.Operation, fldP errs = append(errs, e...) earlyReturn = true } + if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } if earlyReturn { return // do not proceed } diff --git a/pkg/apis/node/v1beta1/zz_generated.validations.go b/pkg/apis/node/v1beta1/zz_generated.validations.go index 2d0129ad982..362d3189a0e 100644 --- a/pkg/apis/node/v1beta1/zz_generated.validations.go +++ b/pkg/apis/node/v1beta1/zz_generated.validations.go @@ -77,6 +77,10 @@ func Validate_RuntimeClass(ctx context.Context, op operation.Operation, fldPath errs = append(errs, e...) earlyReturn = true } + if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 { + errs = append(errs, e...) + earlyReturn = true + } if earlyReturn { return // do not proceed } diff --git a/pkg/apis/node/validation/validation.go b/pkg/apis/node/validation/validation.go index b4a54697d3a..85182066d91 100644 --- a/pkg/apis/node/validation/validation.go +++ b/pkg/apis/node/validation/validation.go @@ -38,9 +38,12 @@ var NodeNormalizationRules = []field.NormalizationRule{ // ValidateRuntimeClass validates the RuntimeClass func ValidateRuntimeClass(rc *node.RuntimeClass) field.ErrorList { allErrs := apivalidation.ValidateObjectMeta(&rc.ObjectMeta, false, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata")) - - for _, msg := range apivalidation.NameIsDNSLabel(rc.Handler, false) { - allErrs = append(allErrs, field.Invalid(field.NewPath("handler"), rc.Handler, msg)).MarkCoveredByDeclarative().WithOrigin("format=k8s-short-name") + if rc.Handler == "" { + allErrs = append(allErrs, field.Required(field.NewPath("handler"), "")).MarkCoveredByDeclarative() + } else { + for _, msg := range apivalidation.NameIsDNSLabel(rc.Handler, false) { + allErrs = append(allErrs, field.Invalid(field.NewPath("handler"), rc.Handler, msg)).MarkCoveredByDeclarative().WithOrigin("format=k8s-short-name") + } } if rc.Overhead != nil { diff --git a/pkg/registry/node/runtimeclass/declarative_validation_test.go b/pkg/registry/node/runtimeclass/declarative_validation_test.go index 95bc0ca6e3b..a0463a87aa8 100644 --- a/pkg/registry/node/runtimeclass/declarative_validation_test.go +++ b/pkg/registry/node/runtimeclass/declarative_validation_test.go @@ -63,10 +63,36 @@ func TestRuntimeClass_DeclarativeValidate_Create(t *testing.T) { }), expectedErrs: field.ErrorList{}, }, - "invalid handler dns label": { + "empty handler": { obj: mkRuntimeClassHandlerOnly(func(rc *node.RuntimeClass) { rc.Handler = "" }), + expectedErrs: field.ErrorList{ + field.Required(field.NewPath("handler"), "must be a valid DNS label"), + }, + }, + "handler with special characters": { + obj: mkRuntimeClassHandlerOnly(func(rc *node.RuntimeClass) { + rc.Handler = "asasdasda&^%" + }), + expectedErrs: field.ErrorList{ + field.Invalid(field.NewPath("handler"), + "", "").WithOrigin("format=k8s-short-name"), + }, + }, + "handler with uppercase and special characters": { + obj: mkRuntimeClassHandlerOnly(func(rc *node.RuntimeClass) { + rc.Handler = "asasdasda&^%&^%$UUUUUUU" + }), + expectedErrs: field.ErrorList{ + field.Invalid(field.NewPath("handler"), + "", "").WithOrigin("format=k8s-short-name"), + }, + }, + "handler exceeds length with invalid characters": { + obj: mkRuntimeClassHandlerOnly(func(rc *node.RuntimeClass) { + rc.Handler = "asasdasda&^%&^%$UUUUUUUaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbcccccccccccccccccccccccc" + }), expectedErrs: field.ErrorList{ field.Invalid(field.NewPath("handler"), "", "").WithOrigin("format=k8s-short-name"), diff --git a/staging/src/k8s.io/api/node/v1/generated.proto b/staging/src/k8s.io/api/node/v1/generated.proto index 64110843a50..1fe85e85c09 100644 --- a/staging/src/k8s.io/api/node/v1/generated.proto +++ b/staging/src/k8s.io/api/node/v1/generated.proto @@ -61,6 +61,8 @@ message RuntimeClass { // and is immutable. // +k8s:format="k8s-short-name" // +k8s:immutable + // +required + // +k8s:required optional string handler = 2; // overhead represents the resource overhead associated with running a pod for a diff --git a/staging/src/k8s.io/api/node/v1/types.go b/staging/src/k8s.io/api/node/v1/types.go index c5209cf594d..e45a02a8c5a 100644 --- a/staging/src/k8s.io/api/node/v1/types.go +++ b/staging/src/k8s.io/api/node/v1/types.go @@ -52,6 +52,8 @@ type RuntimeClass struct { // and is immutable. // +k8s:format="k8s-short-name" // +k8s:immutable + // +required + // +k8s:required Handler string `json:"handler" protobuf:"bytes,2,opt,name=handler"` // overhead represents the resource overhead associated with running a pod for a diff --git a/staging/src/k8s.io/api/node/v1alpha1/generated.proto b/staging/src/k8s.io/api/node/v1alpha1/generated.proto index 93decdd4228..bebee4e49ee 100644 --- a/staging/src/k8s.io/api/node/v1alpha1/generated.proto +++ b/staging/src/k8s.io/api/node/v1alpha1/generated.proto @@ -82,6 +82,8 @@ message RuntimeClassSpec { // requirements, and is immutable. // +k8s:format="k8s-short-name" // +k8s:immutable + // +required + // +k8s:required optional string runtimeHandler = 1; // overhead represents the resource overhead associated with running a pod for a diff --git a/staging/src/k8s.io/api/node/v1alpha1/types.go b/staging/src/k8s.io/api/node/v1alpha1/types.go index aa107e1bb3a..4837a8a19a6 100644 --- a/staging/src/k8s.io/api/node/v1alpha1/types.go +++ b/staging/src/k8s.io/api/node/v1alpha1/types.go @@ -61,6 +61,8 @@ type RuntimeClassSpec struct { // requirements, and is immutable. // +k8s:format="k8s-short-name" // +k8s:immutable + // +required + // +k8s:required RuntimeHandler string `json:"runtimeHandler" protobuf:"bytes,1,opt,name=runtimeHandler"` // overhead represents the resource overhead associated with running a pod for a diff --git a/staging/src/k8s.io/api/node/v1beta1/generated.proto b/staging/src/k8s.io/api/node/v1beta1/generated.proto index d9156cd052c..95dcf2400aa 100644 --- a/staging/src/k8s.io/api/node/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/node/v1beta1/generated.proto @@ -61,6 +61,8 @@ message RuntimeClass { // and is immutable. // +k8s:format="k8s-short-name" // +k8s:immutable + // +required + // +k8s:required optional string handler = 2; // overhead represents the resource overhead associated with running a pod for a diff --git a/staging/src/k8s.io/api/node/v1beta1/types.go b/staging/src/k8s.io/api/node/v1beta1/types.go index 20aefdf3ab0..10f38330ea7 100644 --- a/staging/src/k8s.io/api/node/v1beta1/types.go +++ b/staging/src/k8s.io/api/node/v1beta1/types.go @@ -53,6 +53,8 @@ type RuntimeClass struct { // and is immutable. // +k8s:format="k8s-short-name" // +k8s:immutable + // +required + // +k8s:required Handler string `json:"handler" protobuf:"bytes,2,opt,name=handler"` // overhead represents the resource overhead associated with running a pod for a