From 348d576c9f71cd7ade152c487b7c7deb6449388e Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Wed, 16 Jul 2025 14:43:15 -0700 Subject: [PATCH] validation: Use JSON names in paths This ensures that things that parse paths (e.g. to extract the leaf part) get API-style names. --- pkg/apis/certificates/v1/zz_generated.validations.go | 4 ++-- pkg/apis/certificates/v1beta1/zz_generated.validations.go | 4 ++-- .../tags/item/union/simple/zz_generated.validations.go | 5 +++-- .../item/zerorooneof/simple/zz_generated.validations.go | 5 +++-- .../code-generator/cmd/validation-gen/validation.go | 8 +++++++- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/pkg/apis/certificates/v1/zz_generated.validations.go b/pkg/apis/certificates/v1/zz_generated.validations.go index 42a1716c4d9..267ed3f0d09 100644 --- a/pkg/apis/certificates/v1/zz_generated.validations.go +++ b/pkg/apis/certificates/v1/zz_generated.validations.go @@ -92,7 +92,7 @@ func Validate_CertificateSigningRequestList(ctx context.Context, op operation.Op return errs } -var zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1_CertificateSigningRequestStatus_Conditions_ = validate.NewUnionMembership([2]string{"Conditions[{\"type\": \"Approved\"}]", ""}, [2]string{"Conditions[{\"type\": \"Denied\"}]", ""}) +var zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1_CertificateSigningRequestStatus_conditions_ = validate.NewUnionMembership([2]string{"conditions[{\"type\": \"Approved\"}]", ""}, [2]string{"conditions[{\"type\": \"Denied\"}]", ""}) func Validate_CertificateSigningRequestStatus(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *certificatesv1.CertificateSigningRequestStatus) (errs field.ErrorList) { // field certificatesv1.CertificateSigningRequestStatus.Conditions @@ -104,7 +104,7 @@ func Validate_CertificateSigningRequestStatus(ctx context.Context, op operation. if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { return // do not proceed } - errs = append(errs, validate.ZeroOrOneOfUnion(ctx, op, fldPath, obj, oldObj, zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1_CertificateSigningRequestStatus_Conditions_, func(list []certificatesv1.CertificateSigningRequestCondition) bool { + errs = append(errs, validate.ZeroOrOneOfUnion(ctx, op, fldPath, obj, oldObj, zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1_CertificateSigningRequestStatus_conditions_, func(list []certificatesv1.CertificateSigningRequestCondition) bool { for i := range list { if list[i].Type == "Approved" { return true diff --git a/pkg/apis/certificates/v1beta1/zz_generated.validations.go b/pkg/apis/certificates/v1beta1/zz_generated.validations.go index 99d3dc0267b..fbc52c7d2d7 100644 --- a/pkg/apis/certificates/v1beta1/zz_generated.validations.go +++ b/pkg/apis/certificates/v1beta1/zz_generated.validations.go @@ -92,7 +92,7 @@ func Validate_CertificateSigningRequestList(ctx context.Context, op operation.Op return errs } -var zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1beta1_CertificateSigningRequestStatus_Conditions_ = validate.NewUnionMembership([2]string{"Conditions[{\"type\": \"Approved\"}]", ""}, [2]string{"Conditions[{\"type\": \"Denied\"}]", ""}) +var zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1beta1_CertificateSigningRequestStatus_conditions_ = validate.NewUnionMembership([2]string{"conditions[{\"type\": \"Approved\"}]", ""}, [2]string{"conditions[{\"type\": \"Denied\"}]", ""}) func Validate_CertificateSigningRequestStatus(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *certificatesv1beta1.CertificateSigningRequestStatus) (errs field.ErrorList) { // field certificatesv1beta1.CertificateSigningRequestStatus.Conditions @@ -104,7 +104,7 @@ func Validate_CertificateSigningRequestStatus(ctx context.Context, op operation. if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 { return // do not proceed } - errs = append(errs, validate.ZeroOrOneOfUnion(ctx, op, fldPath, obj, oldObj, zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1beta1_CertificateSigningRequestStatus_Conditions_, func(list []certificatesv1beta1.CertificateSigningRequestCondition) bool { + errs = append(errs, validate.ZeroOrOneOfUnion(ctx, op, fldPath, obj, oldObj, zeroOrOneOfMembershipFor_k8s_io_api_certificates_v1beta1_CertificateSigningRequestStatus_conditions_, func(list []certificatesv1beta1.CertificateSigningRequestCondition) bool { for i := range list { if list[i].Type == "Approved" { return true diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/union/simple/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/union/simple/zz_generated.validations.go index e4c30f1b9ec..54717a2c161 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/union/simple/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/union/simple/zz_generated.validations.go @@ -48,7 +48,7 @@ func RegisterValidations(scheme *testscheme.Scheme) error { return nil } -var unionMembershipFor_k8s_io_code_generator_cmd_validation_gen_output_tests_tags_item_union_simple_Struct_Tasks_ = validate.NewUnionMembership([2]string{"Tasks[{\"name\": \"succeeded\"}]", ""}, [2]string{"Tasks[{\"name\": \"failed\"}]", ""}) +var unionMembershipFor_k8s_io_code_generator_cmd_validation_gen_output_tests_tags_item_union_simple_Struct_tasks_ = validate.NewUnionMembership([2]string{"tasks[{\"name\": \"succeeded\"}]", ""}, [2]string{"tasks[{\"name\": \"failed\"}]", ""}) func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) { // field Struct.TypeMeta has no validation @@ -59,7 +59,8 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { return nil // no changes } - errs = append(errs, validate.Union(ctx, op, fldPath, obj, oldObj, unionMembershipFor_k8s_io_code_generator_cmd_validation_gen_output_tests_tags_item_union_simple_Struct_Tasks_, func(list []Task) bool { + // call field-attached validations + errs = append(errs, validate.Union(ctx, op, fldPath, obj, oldObj, unionMembershipFor_k8s_io_code_generator_cmd_validation_gen_output_tests_tags_item_union_simple_Struct_tasks_, func(list []Task) bool { for i := range list { if list[i].Name == "failed" { return true diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/zerorooneof/simple/zz_generated.validations.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/zerorooneof/simple/zz_generated.validations.go index eaafaf1f2be..70f7fad399c 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/zerorooneof/simple/zz_generated.validations.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/output_tests/tags/item/zerorooneof/simple/zz_generated.validations.go @@ -48,7 +48,7 @@ func RegisterValidations(scheme *testscheme.Scheme) error { return nil } -var zeroOrOneOfMembershipFor_k8s_io_code_generator_cmd_validation_gen_output_tests_tags_item_zerorooneof_simple_Struct_Tasks_ = validate.NewUnionMembership([2]string{"Tasks[{\"name\": \"succeeded\"}]", ""}, [2]string{"Tasks[{\"name\": \"failed\"}]", ""}) +var zeroOrOneOfMembershipFor_k8s_io_code_generator_cmd_validation_gen_output_tests_tags_item_zerorooneof_simple_Struct_tasks_ = validate.NewUnionMembership([2]string{"tasks[{\"name\": \"succeeded\"}]", ""}, [2]string{"tasks[{\"name\": \"failed\"}]", ""}) func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) { // field Struct.TypeMeta has no validation @@ -59,7 +59,8 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) { return nil // no changes } - errs = append(errs, validate.ZeroOrOneOfUnion(ctx, op, fldPath, obj, oldObj, zeroOrOneOfMembershipFor_k8s_io_code_generator_cmd_validation_gen_output_tests_tags_item_zerorooneof_simple_Struct_Tasks_, func(list []Task) bool { + // call field-attached validations + errs = append(errs, validate.ZeroOrOneOfUnion(ctx, op, fldPath, obj, oldObj, zeroOrOneOfMembershipFor_k8s_io_code_generator_cmd_validation_gen_output_tests_tags_item_zerorooneof_simple_Struct_tasks_, func(list []Task) bool { for i := range list { if list[i].Name == "failed" { return true diff --git a/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go b/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go index 491c9f9fa38..096663caad0 100644 --- a/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go +++ b/staging/src/k8s.io/code-generator/cmd/validation-gen/validation.go @@ -607,8 +607,14 @@ func (td *typeDiscoverer) discoverStruct(thisNode *typeNode, fldPath *field.Path jsonName = commentTags.Name } + var childPath *field.Path + if jsonName != "" { + childPath = fldPath.Child(jsonName) + } else { + childPath = fldPath.Child(name) + } + // Discover the field type. - childPath := fldPath.Child(name) klog.V(5).InfoS("field", "name", name, "jsonName", jsonName, "type", memb.Type, "path", childPath) childType := memb.Type var child *childNode