mirror of
https://github.com/k3s-io/kubernetes.git
synced 2026-07-17 20:00:07 +00:00
Merge pull request #132236 from yongruilin/master_vg_ratcheting-default
feat(validation-gen): add default validation ratcheting support
This commit is contained in:
@@ -68,6 +68,9 @@ func Validate_ScaleSpec(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) {
|
||||
// optional value-type fields with zero-value defaults are purely documentation
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...)
|
||||
return
|
||||
}(fldPath.Child("replicas"), &obj.Replicas, safe.Field(oldObj, func(oldObj *appsv1beta1.ScaleSpec) *int32 { return &oldObj.Replicas }))...)
|
||||
|
||||
@@ -68,6 +68,9 @@ func Validate_ScaleSpec(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) {
|
||||
// optional value-type fields with zero-value defaults are purely documentation
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...)
|
||||
return
|
||||
}(fldPath.Child("replicas"), &obj.Replicas, safe.Field(oldObj, func(oldObj *appsv1beta2.ScaleSpec) *int32 { return &oldObj.Replicas }))...)
|
||||
|
||||
@@ -68,6 +68,9 @@ func Validate_ScaleSpec(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) {
|
||||
// optional value-type fields with zero-value defaults are purely documentation
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...)
|
||||
return
|
||||
}(fldPath.Child("replicas"), &obj.Replicas, safe.Field(oldObj, func(oldObj *autoscalingv1.ScaleSpec) *int32 { return &oldObj.Replicas }))...)
|
||||
|
||||
10
pkg/apis/core/v1/zz_generated.validations.go
generated
10
pkg/apis/core/v1/zz_generated.validations.go
generated
@@ -26,6 +26,7 @@ import (
|
||||
fmt "fmt"
|
||||
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -77,6 +78,9 @@ func Validate_ReplicationControllerList(ctx context.Context, op operation.Operat
|
||||
// field corev1.ReplicationControllerList.Items
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []corev1.ReplicationController) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, Validate_ReplicationController)...)
|
||||
return
|
||||
}(fldPath.Child("items"), obj.Items, safe.Field(oldObj, func(oldObj *corev1.ReplicationControllerList) []corev1.ReplicationController { return oldObj.Items }))...)
|
||||
@@ -88,6 +92,9 @@ func Validate_ReplicationControllerSpec(ctx context.Context, op operation.Operat
|
||||
// field corev1.ReplicationControllerSpec.Replicas
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
@@ -101,6 +108,9 @@ func Validate_ReplicationControllerSpec(ctx context.Context, op operation.Operat
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) {
|
||||
// optional value-type fields with zero-value defaults are purely documentation
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...)
|
||||
return
|
||||
}(fldPath.Child("minReadySeconds"), &obj.MinReadySeconds, safe.Field(oldObj, func(oldObj *corev1.ReplicationControllerSpec) *int32 { return &oldObj.MinReadySeconds }))...)
|
||||
|
||||
@@ -67,6 +67,9 @@ func Validate_ScaleSpec(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) {
|
||||
// optional value-type fields with zero-value defaults are purely documentation
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 0)...)
|
||||
return
|
||||
}(fldPath.Child("replicas"), &obj.Replicas, safe.Field(oldObj, func(oldObj *ScaleSpec) *int32 { return &oldObj.Replicas }))...)
|
||||
|
||||
@@ -65,6 +65,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T1) *string { return &oldObj.S }))...)
|
||||
@@ -72,6 +75,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.T2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T2")...)
|
||||
errs = append(errs, Validate_T2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -80,6 +86,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.T3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T3")...)
|
||||
return
|
||||
}(fldPath.Child("t3"), &obj.T3, safe.Field(oldObj, func(oldObj *T1) *T3 { return &oldObj.T3 }))...)
|
||||
@@ -91,6 +100,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T2) *string { return &oldObj.S }))...)
|
||||
@@ -102,6 +114,9 @@ func Validate_T4(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T4.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T4.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T4) *string { return &oldObj.S }))...)
|
||||
|
||||
@@ -56,6 +56,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_E1(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
// type E1
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type E1")...)
|
||||
|
||||
return errs
|
||||
@@ -63,11 +66,17 @@ func Validate_E1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T1) (errs field.ErrorList) {
|
||||
// type T1
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T1")...)
|
||||
|
||||
// field T1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T1) *string { return &oldObj.S }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -56,6 +57,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PrimitivesT1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *primitives.T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.PrimitivesT1")...)
|
||||
errs = append(errs, primitives.Validate_T1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -64,6 +68,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PrimitivesT1Ptr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *primitives.T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.PrimitivesT1Ptr")...)
|
||||
errs = append(errs, primitives.Validate_T1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -72,6 +79,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PrimitivesT2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *primitives.T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.PrimitivesT2")...)
|
||||
errs = append(errs, primitives.Validate_T2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -80,6 +90,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PrimitivesT2Ptr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *primitives.T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.PrimitivesT2Ptr")...)
|
||||
errs = append(errs, primitives.Validate_T1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -88,6 +101,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PrimitivesT3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *primitives.T3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.PrimitivesT3")...)
|
||||
return
|
||||
}(fldPath.Child("primitivest3"), &obj.PrimitivesT3, safe.Field(oldObj, func(oldObj *T1) *primitives.T3 { return &oldObj.PrimitivesT3 }))...)
|
||||
@@ -95,6 +111,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PrimitivesT3Ptr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *primitives.T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.PrimitivesT3Ptr")...)
|
||||
errs = append(errs, primitives.Validate_T1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -103,6 +122,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.TypedefsE1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *typedefs.E1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.TypedefsE1")...)
|
||||
errs = append(errs, typedefs.Validate_E1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -111,6 +133,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.TypedefsE1Ptr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *typedefs.E1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.TypedefsE1Ptr")...)
|
||||
errs = append(errs, typedefs.Validate_E1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -119,6 +144,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.TypedefsE2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *typedefs.E2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.TypedefsE2")...)
|
||||
errs = append(errs, typedefs.Validate_E2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -127,6 +155,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.TypedefsE2Ptr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *typedefs.E2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.TypedefsE2Ptr")...)
|
||||
errs = append(errs, typedefs.Validate_E2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -135,6 +166,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.TypedefsE3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *typedefs.E3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.TypedefsE3")...)
|
||||
errs = append(errs, typedefs.Validate_E3(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -143,6 +177,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.TypedefsE3Ptr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *typedefs.E3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.TypedefsE3Ptr")...)
|
||||
errs = append(errs, typedefs.Validate_E3(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -151,6 +188,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.TypedefsE4
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *typedefs.E4) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.TypedefsE4")...)
|
||||
errs = append(errs, typedefs.Validate_E4(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -159,6 +199,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.TypedefsE4Ptr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *typedefs.E4) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.TypedefsE4Ptr")...)
|
||||
errs = append(errs, typedefs.Validate_E4(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -167,6 +210,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.OtherString
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *other.StringType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.OtherString")...)
|
||||
return
|
||||
}(fldPath.Child("otherString"), &obj.OtherString, safe.Field(oldObj, func(oldObj *T1) *other.StringType { return &oldObj.OtherString }))...)
|
||||
@@ -174,6 +220,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.OtherStringPtr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *other.StringType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.OtherStringPtr")...)
|
||||
return
|
||||
}(fldPath.Child("otherStringPtr"), obj.OtherStringPtr, safe.Field(oldObj, func(oldObj *T1) *other.StringType { return oldObj.OtherStringPtr }))...)
|
||||
@@ -181,6 +230,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.OtherInt
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *other.IntType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.OtherInt")...)
|
||||
return
|
||||
}(fldPath.Child("otherInt"), &obj.OtherInt, safe.Field(oldObj, func(oldObj *T1) *other.IntType { return &oldObj.OtherInt }))...)
|
||||
@@ -188,6 +240,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.OtherIntPtr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *other.IntType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.OtherIntPtr")...)
|
||||
return
|
||||
}(fldPath.Child("otherIntPtr"), obj.OtherIntPtr, safe.Field(oldObj, func(oldObj *T1) *other.IntType { return oldObj.OtherIntPtr }))...)
|
||||
@@ -195,6 +250,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.OtherStruct
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *other.StructType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.OtherStruct")...)
|
||||
return
|
||||
}(fldPath.Child("otherStruct"), &obj.OtherStruct, safe.Field(oldObj, func(oldObj *T1) *other.StructType { return &oldObj.OtherStruct }))...)
|
||||
@@ -202,6 +260,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.OtherStructPtr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *other.StructType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.OtherStructPtr")...)
|
||||
return
|
||||
}(fldPath.Child("otherStructPtr"), obj.OtherStructPtr, safe.Field(oldObj, func(oldObj *T1) *other.StructType { return oldObj.OtherStructPtr }))...)
|
||||
@@ -209,6 +270,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.SliceOfOtherStruct
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []other.StructType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.SliceOfOtherStruct")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *other.StructType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.SliceOfOtherStruct values")
|
||||
@@ -219,6 +283,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.ListMapOfOtherStruct
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []other.StructType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.ListMapOfOtherStruct")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a other.StructType, b other.StructType) bool { return a.StringField == b.StringField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *other.StructType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.SliceOfOtherStruct values")
|
||||
@@ -229,6 +296,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.MapOfOtherStringToOtherStruct
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[other.StringType]other.StructType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *other.StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.MapOfOtherStringToOtherStruct keys")
|
||||
})...)
|
||||
|
||||
@@ -51,6 +51,9 @@ func Validate_HasFieldVal(ctx context.Context, op operation.Operation, fldPath *
|
||||
// field HasFieldVal.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field HasFieldVal.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *HasFieldVal) *string { return &oldObj.S }))...)
|
||||
@@ -60,6 +63,9 @@ func Validate_HasFieldVal(ctx context.Context, op operation.Operation, fldPath *
|
||||
|
||||
func Validate_HasTypeVal(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *HasTypeVal) (errs field.ErrorList) {
|
||||
// type HasTypeVal
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type HasTypeVal")...)
|
||||
|
||||
// field HasTypeVal.S has no validation
|
||||
@@ -88,6 +94,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.HasNoValFieldVal
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *HasNoVal) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.HasNoValFieldVal")...)
|
||||
return
|
||||
}(fldPath.Child("hasNoValFieldVal"), &obj.HasNoValFieldVal, safe.Field(oldObj, func(oldObj *T1) *HasNoVal { return &oldObj.HasNoValFieldVal }))...)
|
||||
|
||||
@@ -71,6 +71,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.IntField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T2.IntField")...)
|
||||
return
|
||||
}(fldPath.Child("intField"), &obj.IntField, safe.Field(oldObj, func(oldObj *T2) *int { return &oldObj.IntField }))...)
|
||||
@@ -82,6 +85,9 @@ func Validate_T3(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T3.StringField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T3.StringField")...)
|
||||
return
|
||||
}(fldPath.Child("stringField"), &obj.StringField, safe.Field(oldObj, func(oldObj *T3) *string { return &oldObj.StringField }))...)
|
||||
@@ -89,6 +95,9 @@ func Validate_T3(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T3.IntField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T3.IntField")...)
|
||||
return
|
||||
}(fldPath.Child("intField"), &obj.IntField, safe.Field(oldObj, func(oldObj *T3) *int { return &oldObj.IntField }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -56,6 +60,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField(keys)")
|
||||
})...)
|
||||
@@ -66,6 +73,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[UnvalidatedStringType]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *UnvalidatedStringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField(keys)")
|
||||
})...)
|
||||
@@ -76,6 +86,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapValidatedTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[ValidatedStringType]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *ValidatedStringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapValidatedTypedefField(keys)")
|
||||
})...)
|
||||
@@ -87,6 +100,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypeField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj UnvalidatedMapType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypeField(keys)")
|
||||
})...)
|
||||
@@ -97,6 +113,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ValidatedMapTypeField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj ValidatedMapType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ValidatedMapTypeField(keys)")
|
||||
})...)
|
||||
@@ -110,6 +129,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
|
||||
func Validate_ValidatedMapType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj ValidatedMapType) (errs field.ErrorList) {
|
||||
// type ValidatedMapType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type ValidatedMapType(keys)")
|
||||
})...)
|
||||
@@ -120,6 +142,9 @@ func Validate_ValidatedMapType(ctx context.Context, op operation.Operation, fldP
|
||||
|
||||
func Validate_ValidatedStringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *ValidatedStringType) (errs field.ErrorList) {
|
||||
// type ValidatedStringType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "ValidatedStringType")...)
|
||||
|
||||
return errs
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) {
|
||||
// type StringType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type StringType")...)
|
||||
|
||||
return errs
|
||||
@@ -56,6 +60,9 @@ func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *f
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -63,6 +70,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField[*]")
|
||||
@@ -73,6 +83,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]StringType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField[*]")
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
// type OtherStruct
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherStruct")...)
|
||||
|
||||
return errs
|
||||
@@ -56,6 +60,9 @@ func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *
|
||||
|
||||
func Validate_OtherTypedefStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherTypedefStruct) (errs field.ErrorList) {
|
||||
// type OtherTypedefStruct
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherTypedefStruct")...)
|
||||
|
||||
return errs
|
||||
@@ -63,6 +70,9 @@ func Validate_OtherTypedefStruct(ctx context.Context, op operation.Operation, fl
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -70,6 +80,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField[*]")
|
||||
@@ -81,6 +94,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]OtherTypedefStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherTypedefStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField[*]")
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -56,6 +60,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField(keys) #1")
|
||||
})...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_MapType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) {
|
||||
// type MapType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapType")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapType[*]")
|
||||
@@ -59,6 +63,9 @@ func Validate_MapType(ctx context.Context, op operation.Operation, fldPath *fiel
|
||||
|
||||
func Validate_MapTypedefType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj MapTypedefType) (errs field.ErrorList) {
|
||||
// type MapTypedefType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapTypedefType")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapTypedefType[*]")
|
||||
@@ -70,6 +77,9 @@ func Validate_MapTypedefType(ctx context.Context, op operation.Operation, fldPat
|
||||
|
||||
func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) {
|
||||
// type StringType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type StringType")...)
|
||||
|
||||
return errs
|
||||
@@ -77,6 +87,9 @@ func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *f
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -84,6 +97,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField[*]")
|
||||
@@ -95,6 +111,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj MapTypedefType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField[*]")
|
||||
|
||||
@@ -49,6 +49,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T1) (errs field.ErrorList) {
|
||||
// type T1
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T1 #1")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T1 #2")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T1 #3")...)
|
||||
@@ -59,6 +62,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.S false #1")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.S false #2")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.S false #3")...)
|
||||
@@ -69,6 +75,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.T2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T2 false #1")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T2 false #2")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T2 false #3")...)
|
||||
@@ -82,6 +91,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
// type T2
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T2 false #1")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T2 false #2")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "type T2 true")...)
|
||||
@@ -89,6 +101,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.S false #1")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.S false #2")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T2.S true")...)
|
||||
|
||||
@@ -49,6 +49,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_E1(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
// type E1
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type E1")...)
|
||||
|
||||
return errs
|
||||
@@ -60,6 +63,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T1) *string { return &oldObj.S }))...)
|
||||
@@ -67,6 +73,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.T2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T2")...)
|
||||
errs = append(errs, Validate_T2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -75,6 +84,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.T3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T3")...)
|
||||
return
|
||||
}(fldPath.Child("t3"), &obj.T3, safe.Field(oldObj, func(oldObj *T1) *T3 { return &oldObj.T3 }))...)
|
||||
@@ -82,6 +94,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.E1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.E1")...)
|
||||
errs = append(errs, Validate_E1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -90,6 +105,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.E2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.E2")...)
|
||||
return
|
||||
}(fldPath.Child("e2"), &obj.E2, safe.Field(oldObj, func(oldObj *T1) *E2 { return &oldObj.E2 }))...)
|
||||
@@ -101,6 +119,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T2) *string { return &oldObj.S }))...)
|
||||
|
||||
@@ -49,6 +49,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T1) (errs field.ErrorList) {
|
||||
// type T1
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T1")...)
|
||||
|
||||
// field T1.TypeMeta has no validation
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -99,6 +100,9 @@ func Validate_T00(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
|
||||
func Validate_T01(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T01) (errs field.ErrorList) {
|
||||
// type T01
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T01, no flags")...)
|
||||
|
||||
// field T01.TypeMeta has no validation
|
||||
@@ -106,6 +110,9 @@ func Validate_T01(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T01.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T01.S, no flags")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T01) *string { return &oldObj.S }))...)
|
||||
@@ -113,6 +120,9 @@ func Validate_T01(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T01.PS
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T01.PS, no flags")...)
|
||||
return
|
||||
}(fldPath.Child("ps"), obj.PS, safe.Field(oldObj, func(oldObj *T01) *string { return oldObj.PS }))...)
|
||||
@@ -120,6 +130,9 @@ func Validate_T01(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T01.T
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *Tother) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T01.T, no flags")...)
|
||||
errs = append(errs, Validate_Tother(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -128,6 +141,9 @@ func Validate_T01(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T01.PT
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *Tother) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T01.PT, no flags")...)
|
||||
errs = append(errs, Validate_Tother(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -138,6 +154,9 @@ func Validate_T01(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
|
||||
func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T02) (errs field.ErrorList) {
|
||||
// type T02
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -148,6 +167,9 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T02.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02.S, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -158,6 +180,9 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T02.PS
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02.PS, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -168,6 +193,9 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T02.T
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *Tother) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02.T, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -179,6 +207,9 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T02.PT
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *Tother) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T02.PT, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -192,6 +223,9 @@ func Validate_T02(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
|
||||
func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T03) (errs field.ErrorList) {
|
||||
// type T03
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -203,6 +237,9 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T03.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.S, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -214,6 +251,9 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T03.PS
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.PS, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -225,6 +265,9 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T03.T
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *Tother) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.T, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -237,6 +280,9 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
// field T03.PT
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *Tother) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "T03.PT, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -251,6 +297,9 @@ func Validate_T03(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
|
||||
func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *TMultiple) (errs field.ErrorList) {
|
||||
// type TMultiple
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple, ShortCircuit 1"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -268,6 +317,9 @@ func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
// field TMultiple.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.S, ShortCircuit 1"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -285,6 +337,9 @@ func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
// field TMultiple.PS
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.PS, ShortCircuit 1"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -302,6 +357,9 @@ func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
// field TMultiple.T
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *Tother) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.T, ShortCircuit 1"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -320,6 +378,9 @@ func Validate_TMultiple(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
// field TMultiple.PT
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *Tother) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "TMultiple.PT, ShortCircuit 1"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -342,6 +403,9 @@ func Validate_Tother(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Tother.OS
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "Tother, no flags")...)
|
||||
return
|
||||
}(fldPath.Child("os"), &obj.OS, safe.Field(oldObj, func(oldObj *Tother) *string { return &oldObj.OS }))...)
|
||||
|
||||
@@ -70,6 +70,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_E01(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E01) (errs field.ErrorList) {
|
||||
// type E01
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "E01, no flags")...)
|
||||
|
||||
return errs
|
||||
@@ -77,6 +80,9 @@ func Validate_E01(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
|
||||
func Validate_E02(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E02) (errs field.ErrorList) {
|
||||
// type E02
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "E02, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -87,6 +93,9 @@ func Validate_E02(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
|
||||
func Validate_E03(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E03) (errs field.ErrorList) {
|
||||
// type E03
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "E03, ShortCircuit"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -98,6 +107,9 @@ func Validate_E03(ctx context.Context, op operation.Operation, fldPath *field.Pa
|
||||
|
||||
func Validate_EMultiple(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *EMultiple) (errs field.ErrorList) {
|
||||
// type EMultiple
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "EMultiple, ShortCircuit 1"); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PS
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PS")...)
|
||||
return
|
||||
}(fldPath.Child("ps"), obj.PS, safe.Field(oldObj, func(oldObj *T1) *string { return oldObj.PS }))...)
|
||||
@@ -60,6 +64,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PI
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PI")...)
|
||||
return
|
||||
}(fldPath.Child("pi"), obj.PI, safe.Field(oldObj, func(oldObj *T1) *int { return oldObj.PI }))...)
|
||||
@@ -67,6 +74,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PB
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PB")...)
|
||||
return
|
||||
}(fldPath.Child("pb"), obj.PB, safe.Field(oldObj, func(oldObj *T1) *bool { return oldObj.PB }))...)
|
||||
@@ -74,6 +84,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PF
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *float64) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PF")...)
|
||||
return
|
||||
}(fldPath.Child("pf"), obj.PF, safe.Field(oldObj, func(oldObj *T1) *float64 { return oldObj.PF }))...)
|
||||
@@ -81,6 +94,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PT2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PT2")...)
|
||||
errs = append(errs, Validate_T2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -97,6 +113,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.PS
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.PS")...)
|
||||
return
|
||||
}(fldPath.Child("ps"), obj.PS, safe.Field(oldObj, func(oldObj *T2) *string { return oldObj.PS }))...)
|
||||
@@ -104,6 +123,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.PI
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.PI")...)
|
||||
return
|
||||
}(fldPath.Child("pi"), obj.PI, safe.Field(oldObj, func(oldObj *T2) *int { return oldObj.PI }))...)
|
||||
@@ -111,6 +133,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.PB
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.PB")...)
|
||||
return
|
||||
}(fldPath.Child("pb"), obj.PB, safe.Field(oldObj, func(oldObj *T2) *bool { return oldObj.PB }))...)
|
||||
@@ -118,6 +143,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.PF
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *float64) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.PF")...)
|
||||
return
|
||||
}(fldPath.Child("pf"), obj.PF, safe.Field(oldObj, func(oldObj *T2) *float64 { return oldObj.PF }))...)
|
||||
|
||||
@@ -53,6 +53,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T1) *string { return &oldObj.S }))...)
|
||||
@@ -60,6 +63,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.I
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.I")...)
|
||||
return
|
||||
}(fldPath.Child("i"), &obj.I, safe.Field(oldObj, func(oldObj *T1) *int { return &oldObj.I }))...)
|
||||
@@ -67,6 +73,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.B
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.B")...)
|
||||
return
|
||||
}(fldPath.Child("b"), &obj.B, safe.Field(oldObj, func(oldObj *T1) *bool { return &oldObj.B }))...)
|
||||
@@ -74,6 +83,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.F
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *float64) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.F")...)
|
||||
return
|
||||
}(fldPath.Child("f"), &obj.F, safe.Field(oldObj, func(oldObj *T1) *float64 { return &oldObj.F }))...)
|
||||
@@ -81,6 +93,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.T2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T2")...)
|
||||
errs = append(errs, Validate_T2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -106,6 +121,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T2) *string { return &oldObj.S }))...)
|
||||
@@ -113,6 +131,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.I
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.I")...)
|
||||
return
|
||||
}(fldPath.Child("i"), &obj.I, safe.Field(oldObj, func(oldObj *T2) *int { return &oldObj.I }))...)
|
||||
@@ -120,6 +141,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.B
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.B")...)
|
||||
return
|
||||
}(fldPath.Child("b"), &obj.B, safe.Field(oldObj, func(oldObj *T2) *bool { return &oldObj.B }))...)
|
||||
@@ -127,6 +151,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.F
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *float64) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.F")...)
|
||||
return
|
||||
}(fldPath.Child("f"), &obj.F, safe.Field(oldObj, func(oldObj *T2) *float64 { return &oldObj.F }))...)
|
||||
|
||||
@@ -51,6 +51,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.Public
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.Public")...)
|
||||
return
|
||||
}(fldPath.Child("public"), &obj.Public, safe.Field(oldObj, func(oldObj *T1) *string { return &oldObj.Public }))...)
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
Copyright 2024 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// +k8s:validation-gen=TypeMeta
|
||||
// +k8s:validation-gen-scheme-registry=k8s.io/code-generator/cmd/validation-gen/testscheme.Scheme
|
||||
|
||||
// This is a test package.
|
||||
package defaultbehavior
|
||||
|
||||
import "k8s.io/code-generator/cmd/validation-gen/testscheme"
|
||||
|
||||
var localSchemeBuilder = testscheme.New()
|
||||
|
||||
type StructPrimitive struct {
|
||||
TypeMeta int
|
||||
|
||||
// +k8s:validateFalse="field intField"
|
||||
IntField int `json:"intField"`
|
||||
|
||||
// +k8s:optional
|
||||
// +k8s:validateFalse="field intPtrField"
|
||||
IntPtrField *int `json:"intPtrField"`
|
||||
}
|
||||
|
||||
type StructSlice struct {
|
||||
TypeMeta int
|
||||
|
||||
// +k8s:validateFalse="field sliceField"
|
||||
SliceField []S `json:"sliceField"`
|
||||
|
||||
// +k8s:validateFalse="field typedefSliceField"
|
||||
TypeDefSliceField MySlice `json:"typedefSliceField"`
|
||||
}
|
||||
|
||||
type StructMap struct {
|
||||
TypeMeta int
|
||||
|
||||
// +k8s:validateFalse="field mapKeyField"
|
||||
MapKeyField map[S]string `json:"mapKeyField"`
|
||||
|
||||
// +k8s:validateFalse="field mapValueField"
|
||||
MapValueField map[string]S `json:"mapValueField"`
|
||||
|
||||
// +k8s:validateFalse="field aliasMapKeyTypeField"
|
||||
AliasMapKeyTypeField AliasMapKeyType `json:"aliasMapKeyTypeField"`
|
||||
|
||||
// +k8s:validateFalse="field aliasMapValueTypeField"
|
||||
AliasMapValueTypeField AliasMapValueType `json:"aliasMapValueTypeField"`
|
||||
}
|
||||
|
||||
type StructStruct struct {
|
||||
TypeMeta int
|
||||
|
||||
// +k8s:validateFalse="field directComparableStructField"
|
||||
DirectComparableStructField DirectComparableStruct `json:"directComparableStructField"`
|
||||
|
||||
// +k8s:validateFalse="field nonDirectComparableStructField"
|
||||
NonDirectComparableStructField NonDirectComparableStruct `json:"nonDirectComparableStructField"`
|
||||
|
||||
// +k8s:validateFalse="field directComparableStructPtrField"
|
||||
DirectComparableStructPtr *DirectComparableStruct `json:"directComparableStructPtrField"`
|
||||
|
||||
// +k8s:validateFalse="field nonDirectComparableStructPtrField"
|
||||
NonDirectComparableStructPtr *NonDirectComparableStruct `json:"nonDirectComparableStructPtrField"`
|
||||
|
||||
// +k8s:validateFalse="field DirectComparableStruct"
|
||||
DirectComparableStruct
|
||||
|
||||
// +k8s:validateFalse="field NonDirectComparableStruct"
|
||||
NonDirectComparableStruct
|
||||
}
|
||||
|
||||
type StructEmbedded struct {
|
||||
TypeMeta int
|
||||
// +k8s:validateFalse="field DirectComparableStruct"
|
||||
DirectComparableStruct `json:"directComparableStruct"`
|
||||
|
||||
// +k8s:validateFalse="field NonDirectComparableStruct"
|
||||
NonDirectComparableStruct `json:"nonDirectComparableStruct"`
|
||||
|
||||
// +k8s:validateFalse="field NestedDirectComparableStructField"
|
||||
NestedDirectComparableStructField NestedDirectComparableStruct `json:"nestedDirectComparableStructField"`
|
||||
|
||||
// +k8s:validateFalse="field NestedNonDirectComparableStructField"
|
||||
NestedNonDirectComparableStructField NestedNonDirectComparableStruct `json:"nestedNonDirectComparableStructField"`
|
||||
}
|
||||
|
||||
// +k8s:validateFalse="type TypeDefStruct"
|
||||
type TypeDefStruct struct{}
|
||||
|
||||
// +k8s:validateFalse="type MySlice"
|
||||
type MySlice []int
|
||||
|
||||
// +k8s:validateFalse="type S"
|
||||
type S string
|
||||
|
||||
// +k8s:validateFalse="type MapKeyType"
|
||||
type AliasMapKeyType MapKeyType
|
||||
|
||||
// +k8s:validateFalse="type MapValueType"
|
||||
type AliasMapValueType MapValueType
|
||||
|
||||
// no validation
|
||||
type MapKeyType map[S]string
|
||||
|
||||
// no validation
|
||||
type MapValueType map[string]S
|
||||
|
||||
// +k8s:validateFalse="type DirectComparableStruct"
|
||||
type DirectComparableStruct struct {
|
||||
// +k8s:validateFalse="field intField"
|
||||
IntField int `json:"intField"`
|
||||
}
|
||||
|
||||
// +k8s:validateFalse="type NonDirectComparableStruct"
|
||||
type NonDirectComparableStruct struct {
|
||||
// +k8s:validateFalse="field intField"
|
||||
IntPtrField *int `json:"intPtrField"`
|
||||
}
|
||||
|
||||
// +k8s:validateFalse="type NestedDirectComparableStruct"
|
||||
type NestedDirectComparableStruct struct {
|
||||
// +k8s:validateFalse="field intField"
|
||||
DirectComparableStructField DirectComparableStruct `json:"directComparableStructField"`
|
||||
}
|
||||
|
||||
// +k8s:validateFalse="type NestedNonDirectComparableStruct"
|
||||
type NestedNonDirectComparableStruct struct {
|
||||
// +k8s:validateFalse="field intField"
|
||||
NonDirectComparableStructField NonDirectComparableStruct `json:"nonDirectComparableStructField"`
|
||||
}
|
||||
@@ -0,0 +1,209 @@
|
||||
/*
|
||||
Copyright 2025 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package defaultbehavior
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||
"k8s.io/utils/ptr"
|
||||
)
|
||||
|
||||
func Test_StructPrimitive(t *testing.T) {
|
||||
st := localSchemeBuilder.Test(t)
|
||||
st.Value(&StructPrimitive{
|
||||
IntField: 1,
|
||||
IntPtrField: ptr.To(1),
|
||||
}).ExpectMatches(field.ErrorMatcher{}.ByType().ByField(), field.ErrorList{
|
||||
field.Invalid(field.NewPath("intField"), "", ""),
|
||||
field.Invalid(field.NewPath("intPtrField"), "", ""),
|
||||
})
|
||||
st.Value(&StructPrimitive{
|
||||
IntField: 1,
|
||||
IntPtrField: ptr.To(1),
|
||||
}).OldValue(&StructPrimitive{
|
||||
IntField: 1,
|
||||
IntPtrField: ptr.To(1), // Different pointers but value unchanged.
|
||||
}).ExpectValid()
|
||||
}
|
||||
|
||||
func Test_StructSlice(t *testing.T) {
|
||||
st := localSchemeBuilder.Test(t)
|
||||
st.Value(&StructSlice{
|
||||
SliceField: []S{""},
|
||||
TypeDefSliceField: MySlice{1},
|
||||
}).ExpectMatches(field.ErrorMatcher{}.ByType().ByField(), field.ErrorList{
|
||||
field.Invalid(field.NewPath("sliceField"), "", ""),
|
||||
field.Invalid(field.NewPath("sliceField[0]"), "", ""),
|
||||
field.Invalid(field.NewPath("typedefSliceField"), "", ""),
|
||||
})
|
||||
|
||||
st.Value(&StructSlice{
|
||||
SliceField: []S{""},
|
||||
TypeDefSliceField: MySlice{1},
|
||||
}).OldValue(&StructSlice{
|
||||
SliceField: []S{""},
|
||||
TypeDefSliceField: MySlice{1},
|
||||
}).ExpectValid()
|
||||
}
|
||||
|
||||
func Test_StructMap(t *testing.T) {
|
||||
st := localSchemeBuilder.Test(t)
|
||||
st.Value(&StructMap{
|
||||
MapKeyField: map[S]string{S("k"): "v"},
|
||||
MapValueField: map[string]S{"k": "v"},
|
||||
AliasMapKeyTypeField: AliasMapKeyType{"k": "v"},
|
||||
AliasMapValueTypeField: AliasMapValueType{"k": "v"},
|
||||
}).ExpectMatches(field.ErrorMatcher{}.ByType().ByField(), field.ErrorList{
|
||||
field.Invalid(field.NewPath("mapKeyField"), "", ""),
|
||||
field.Invalid(field.NewPath("mapValueField"), "", ""),
|
||||
field.Invalid(field.NewPath("mapValueField[k]"), "", ""),
|
||||
field.Invalid(field.NewPath("aliasMapKeyTypeField"), "", ""),
|
||||
field.Invalid(field.NewPath("aliasMapValueTypeField"), "", ""),
|
||||
field.Invalid(field.NewPath("aliasMapValueTypeField[k]"), "", ""),
|
||||
})
|
||||
|
||||
st.Value(&StructMap{
|
||||
MapKeyField: map[S]string{S("k"): "v"},
|
||||
MapValueField: map[string]S{"k": "v"},
|
||||
AliasMapKeyTypeField: AliasMapKeyType{"k": "v"},
|
||||
AliasMapValueTypeField: AliasMapValueType{"k": "v"},
|
||||
}).OldValue(&StructMap{
|
||||
MapKeyField: map[S]string{S("k"): "v"},
|
||||
MapValueField: map[string]S{"k": "v"},
|
||||
AliasMapKeyTypeField: AliasMapKeyType{"k": "v"},
|
||||
AliasMapValueTypeField: AliasMapValueType{"k": "v"},
|
||||
}).ExpectValid()
|
||||
}
|
||||
|
||||
func Test_StructStruct(t *testing.T) {
|
||||
st := localSchemeBuilder.Test(t)
|
||||
st.Value(&StructStruct{
|
||||
DirectComparableStructField: DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStructField: NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
DirectComparableStructPtr: &DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStructPtr: &NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
}).ExpectMatches(field.ErrorMatcher{}.ByType().ByField(), field.ErrorList{
|
||||
field.Invalid(field.NewPath("directComparableStructField"), "", ""),
|
||||
field.Invalid(field.NewPath("nonDirectComparableStructField"), "", ""),
|
||||
field.Invalid(field.NewPath("directComparableStructField").Child("intField"), "", ""),
|
||||
field.Invalid(field.NewPath("nonDirectComparableStructField").Child("intPtrField"), "", ""),
|
||||
field.Invalid(field.NewPath("directComparableStructPtrField"), "", ""),
|
||||
field.Invalid(field.NewPath("nonDirectComparableStructPtrField"), "", ""),
|
||||
field.Invalid(field.NewPath("directComparableStructPtrField").Child("intField"), "", ""),
|
||||
field.Invalid(field.NewPath("nonDirectComparableStructPtrField").Child("intPtrField"), "", ""),
|
||||
field.Invalid(field.NewPath("DirectComparableStruct"), "", ""),
|
||||
field.Invalid(field.NewPath("NonDirectComparableStruct"), "", ""),
|
||||
field.Invalid(field.NewPath("DirectComparableStruct").Child("intField"), "", ""),
|
||||
field.Invalid(field.NewPath("NonDirectComparableStruct").Child("intPtrField"), "", ""),
|
||||
})
|
||||
|
||||
st.Value(&StructStruct{
|
||||
DirectComparableStructField: DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStructField: NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
DirectComparableStructPtr: &DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStructPtr: &NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
}).OldValue(&StructStruct{
|
||||
DirectComparableStructField: DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStructField: NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
DirectComparableStructPtr: &DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStructPtr: &NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
}).ExpectValid()
|
||||
}
|
||||
|
||||
func Test_StructEmbedded(t *testing.T) {
|
||||
st := localSchemeBuilder.Test(t)
|
||||
st.Value(&StructEmbedded{
|
||||
DirectComparableStruct: DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStruct: NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
}).ExpectMatches(field.ErrorMatcher{}.ByType().ByField(), field.ErrorList{
|
||||
field.Invalid(field.NewPath("directComparableStruct"), "", ""),
|
||||
field.Invalid(field.NewPath("nonDirectComparableStruct"), "", ""),
|
||||
field.Invalid(field.NewPath("directComparableStruct").Child("intField"), "", ""),
|
||||
field.Invalid(field.NewPath("nonDirectComparableStruct").Child("intPtrField"), "", ""),
|
||||
field.Invalid(field.NewPath("nestedDirectComparableStructField"), "", ""),
|
||||
field.Invalid(field.NewPath("nestedDirectComparableStructField").Child("directComparableStructField"), "", ""),
|
||||
field.Invalid(field.NewPath("nestedDirectComparableStructField").Child("directComparableStructField").Child("intField"), "", ""),
|
||||
field.Invalid(field.NewPath("nestedNonDirectComparableStructField"), "", ""),
|
||||
field.Invalid(field.NewPath("nestedNonDirectComparableStructField").Child("nonDirectComparableStructField"), "", ""),
|
||||
field.Invalid(field.NewPath("nestedNonDirectComparableStructField").Child("nonDirectComparableStructField").Child("intPtrField"), "", ""),
|
||||
})
|
||||
|
||||
st.Value(&StructEmbedded{
|
||||
DirectComparableStruct: DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStruct: NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
NestedDirectComparableStructField: NestedDirectComparableStruct{
|
||||
DirectComparableStructField: DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
},
|
||||
NestedNonDirectComparableStructField: NestedNonDirectComparableStruct{
|
||||
NonDirectComparableStructField: NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
},
|
||||
}).OldValue(&StructEmbedded{
|
||||
DirectComparableStruct: DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
NonDirectComparableStruct: NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
NestedDirectComparableStructField: NestedDirectComparableStruct{
|
||||
DirectComparableStructField: DirectComparableStruct{
|
||||
IntField: 1,
|
||||
},
|
||||
},
|
||||
NestedNonDirectComparableStructField: NestedNonDirectComparableStruct{
|
||||
NonDirectComparableStructField: NonDirectComparableStruct{
|
||||
IntPtrField: ptr.To(1),
|
||||
},
|
||||
},
|
||||
}).ExpectValid()
|
||||
}
|
||||
@@ -0,0 +1,438 @@
|
||||
//go:build !ignore_autogenerated
|
||||
// +build !ignore_autogenerated
|
||||
|
||||
/*
|
||||
Copyright The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
// Code generated by validation-gen. DO NOT EDIT.
|
||||
|
||||
package defaultbehavior
|
||||
|
||||
import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
field "k8s.io/apimachinery/pkg/util/validation/field"
|
||||
testscheme "k8s.io/code-generator/cmd/validation-gen/testscheme"
|
||||
)
|
||||
|
||||
func init() { localSchemeBuilder.Register(RegisterValidations) }
|
||||
|
||||
// RegisterValidations adds validation functions to the given scheme.
|
||||
// Public to allow building arbitrary schemes.
|
||||
func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
scheme.AddValidationFunc((*StructEmbedded)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList {
|
||||
switch op.Request.SubresourcePath() {
|
||||
case "/":
|
||||
return Validate_StructEmbedded(ctx, op, nil /* fldPath */, obj.(*StructEmbedded), safe.Cast[*StructEmbedded](oldObj))
|
||||
}
|
||||
return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))}
|
||||
})
|
||||
scheme.AddValidationFunc((*StructMap)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList {
|
||||
switch op.Request.SubresourcePath() {
|
||||
case "/":
|
||||
return Validate_StructMap(ctx, op, nil /* fldPath */, obj.(*StructMap), safe.Cast[*StructMap](oldObj))
|
||||
}
|
||||
return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))}
|
||||
})
|
||||
scheme.AddValidationFunc((*StructPrimitive)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList {
|
||||
switch op.Request.SubresourcePath() {
|
||||
case "/":
|
||||
return Validate_StructPrimitive(ctx, op, nil /* fldPath */, obj.(*StructPrimitive), safe.Cast[*StructPrimitive](oldObj))
|
||||
}
|
||||
return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))}
|
||||
})
|
||||
scheme.AddValidationFunc((*StructSlice)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList {
|
||||
switch op.Request.SubresourcePath() {
|
||||
case "/":
|
||||
return Validate_StructSlice(ctx, op, nil /* fldPath */, obj.(*StructSlice), safe.Cast[*StructSlice](oldObj))
|
||||
}
|
||||
return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))}
|
||||
})
|
||||
scheme.AddValidationFunc((*StructStruct)(nil), func(ctx context.Context, op operation.Operation, obj, oldObj interface{}) field.ErrorList {
|
||||
switch op.Request.SubresourcePath() {
|
||||
case "/":
|
||||
return Validate_StructStruct(ctx, op, nil /* fldPath */, obj.(*StructStruct), safe.Cast[*StructStruct](oldObj))
|
||||
}
|
||||
return field.ErrorList{field.InternalError(nil, fmt.Errorf("no validation found for %T, subresource: %v", obj, op.Request.SubresourcePath()))}
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
func Validate_AliasMapKeyType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj AliasMapKeyType) (errs field.ErrorList) {
|
||||
// type AliasMapKeyType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapKeyType")...)
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, Validate_S)...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_AliasMapValueType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj AliasMapValueType) (errs field.ErrorList) {
|
||||
// type AliasMapValueType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapValueType")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, Validate_S)...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_DirectComparableStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *DirectComparableStruct) (errs field.ErrorList) {
|
||||
// type DirectComparableStruct
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type DirectComparableStruct")...)
|
||||
|
||||
// field DirectComparableStruct.IntField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field intField")...)
|
||||
return
|
||||
}(fldPath.Child("intField"), &obj.IntField, safe.Field(oldObj, func(oldObj *DirectComparableStruct) *int { return &oldObj.IntField }))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_MySlice(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj MySlice) (errs field.ErrorList) {
|
||||
// type MySlice
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MySlice")...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_NestedDirectComparableStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *NestedDirectComparableStruct) (errs field.ErrorList) {
|
||||
// type NestedDirectComparableStruct
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type NestedDirectComparableStruct")...)
|
||||
|
||||
// field NestedDirectComparableStruct.DirectComparableStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *DirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field intField")...)
|
||||
errs = append(errs, Validate_DirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("directComparableStructField"), &obj.DirectComparableStructField, safe.Field(oldObj, func(oldObj *NestedDirectComparableStruct) *DirectComparableStruct {
|
||||
return &oldObj.DirectComparableStructField
|
||||
}))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_NestedNonDirectComparableStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *NestedNonDirectComparableStruct) (errs field.ErrorList) {
|
||||
// type NestedNonDirectComparableStruct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type NestedNonDirectComparableStruct")...)
|
||||
|
||||
// field NestedNonDirectComparableStruct.NonDirectComparableStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NonDirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field intField")...)
|
||||
errs = append(errs, Validate_NonDirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("nonDirectComparableStructField"), &obj.NonDirectComparableStructField, safe.Field(oldObj, func(oldObj *NestedNonDirectComparableStruct) *NonDirectComparableStruct {
|
||||
return &oldObj.NonDirectComparableStructField
|
||||
}))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_NonDirectComparableStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *NonDirectComparableStruct) (errs field.ErrorList) {
|
||||
// type NonDirectComparableStruct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type NonDirectComparableStruct")...)
|
||||
|
||||
// field NonDirectComparableStruct.IntPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field intField")...)
|
||||
return
|
||||
}(fldPath.Child("intPtrField"), obj.IntPtrField, safe.Field(oldObj, func(oldObj *NonDirectComparableStruct) *int { return oldObj.IntPtrField }))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_S(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *S) (errs field.ErrorList) {
|
||||
// type S
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type S")...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_StructEmbedded(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StructEmbedded) (errs field.ErrorList) {
|
||||
// field StructEmbedded.TypeMeta has no validation
|
||||
|
||||
// field StructEmbedded.DirectComparableStruct
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *DirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field DirectComparableStruct")...)
|
||||
errs = append(errs, Validate_DirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("directComparableStruct"), &obj.DirectComparableStruct, safe.Field(oldObj, func(oldObj *StructEmbedded) *DirectComparableStruct { return &oldObj.DirectComparableStruct }))...)
|
||||
|
||||
// field StructEmbedded.NonDirectComparableStruct
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NonDirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field NonDirectComparableStruct")...)
|
||||
errs = append(errs, Validate_NonDirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("nonDirectComparableStruct"), &obj.NonDirectComparableStruct, safe.Field(oldObj, func(oldObj *StructEmbedded) *NonDirectComparableStruct { return &oldObj.NonDirectComparableStruct }))...)
|
||||
|
||||
// field StructEmbedded.NestedDirectComparableStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NestedDirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field NestedDirectComparableStructField")...)
|
||||
errs = append(errs, Validate_NestedDirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("nestedDirectComparableStructField"), &obj.NestedDirectComparableStructField, safe.Field(oldObj, func(oldObj *StructEmbedded) *NestedDirectComparableStruct {
|
||||
return &oldObj.NestedDirectComparableStructField
|
||||
}))...)
|
||||
|
||||
// field StructEmbedded.NestedNonDirectComparableStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NestedNonDirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field NestedNonDirectComparableStructField")...)
|
||||
errs = append(errs, Validate_NestedNonDirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("nestedNonDirectComparableStructField"), &obj.NestedNonDirectComparableStructField, safe.Field(oldObj, func(oldObj *StructEmbedded) *NestedNonDirectComparableStruct {
|
||||
return &oldObj.NestedNonDirectComparableStructField
|
||||
}))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_StructMap(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StructMap) (errs field.ErrorList) {
|
||||
// field StructMap.TypeMeta has no validation
|
||||
|
||||
// field StructMap.MapKeyField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[S]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field mapKeyField")...)
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, Validate_S)...)
|
||||
return
|
||||
}(fldPath.Child("mapKeyField"), obj.MapKeyField, safe.Field(oldObj, func(oldObj *StructMap) map[S]string { return oldObj.MapKeyField }))...)
|
||||
|
||||
// field StructMap.MapValueField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]S) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field mapValueField")...)
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, Validate_S)...)
|
||||
return
|
||||
}(fldPath.Child("mapValueField"), obj.MapValueField, safe.Field(oldObj, func(oldObj *StructMap) map[string]S { return oldObj.MapValueField }))...)
|
||||
|
||||
// field StructMap.AliasMapKeyTypeField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj AliasMapKeyType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field aliasMapKeyTypeField")...)
|
||||
errs = append(errs, Validate_AliasMapKeyType(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("aliasMapKeyTypeField"), obj.AliasMapKeyTypeField, safe.Field(oldObj, func(oldObj *StructMap) AliasMapKeyType { return oldObj.AliasMapKeyTypeField }))...)
|
||||
|
||||
// field StructMap.AliasMapValueTypeField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj AliasMapValueType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field aliasMapValueTypeField")...)
|
||||
errs = append(errs, Validate_AliasMapValueType(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("aliasMapValueTypeField"), obj.AliasMapValueTypeField, safe.Field(oldObj, func(oldObj *StructMap) AliasMapValueType { return oldObj.AliasMapValueTypeField }))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_StructPrimitive(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StructPrimitive) (errs field.ErrorList) {
|
||||
// field StructPrimitive.TypeMeta has no validation
|
||||
|
||||
// field StructPrimitive.IntField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field intField")...)
|
||||
return
|
||||
}(fldPath.Child("intField"), &obj.IntField, safe.Field(oldObj, func(oldObj *StructPrimitive) *int { return &oldObj.IntField }))...)
|
||||
|
||||
// field StructPrimitive.IntPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field intPtrField")...)
|
||||
return
|
||||
}(fldPath.Child("intPtrField"), obj.IntPtrField, safe.Field(oldObj, func(oldObj *StructPrimitive) *int { return oldObj.IntPtrField }))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_StructSlice(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StructSlice) (errs field.ErrorList) {
|
||||
// field StructSlice.TypeMeta has no validation
|
||||
|
||||
// field StructSlice.SliceField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []S) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field sliceField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, Validate_S)...)
|
||||
return
|
||||
}(fldPath.Child("sliceField"), obj.SliceField, safe.Field(oldObj, func(oldObj *StructSlice) []S { return oldObj.SliceField }))...)
|
||||
|
||||
// field StructSlice.TypeDefSliceField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj MySlice) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field typedefSliceField")...)
|
||||
errs = append(errs, Validate_MySlice(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("typedefSliceField"), obj.TypeDefSliceField, safe.Field(oldObj, func(oldObj *StructSlice) MySlice { return oldObj.TypeDefSliceField }))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
|
||||
func Validate_StructStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StructStruct) (errs field.ErrorList) {
|
||||
// field StructStruct.TypeMeta has no validation
|
||||
|
||||
// field StructStruct.DirectComparableStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *DirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field directComparableStructField")...)
|
||||
errs = append(errs, Validate_DirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("directComparableStructField"), &obj.DirectComparableStructField, safe.Field(oldObj, func(oldObj *StructStruct) *DirectComparableStruct { return &oldObj.DirectComparableStructField }))...)
|
||||
|
||||
// field StructStruct.NonDirectComparableStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NonDirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field nonDirectComparableStructField")...)
|
||||
errs = append(errs, Validate_NonDirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("nonDirectComparableStructField"), &obj.NonDirectComparableStructField, safe.Field(oldObj, func(oldObj *StructStruct) *NonDirectComparableStruct { return &oldObj.NonDirectComparableStructField }))...)
|
||||
|
||||
// field StructStruct.DirectComparableStructPtr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *DirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field directComparableStructPtrField")...)
|
||||
errs = append(errs, Validate_DirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("directComparableStructPtrField"), obj.DirectComparableStructPtr, safe.Field(oldObj, func(oldObj *StructStruct) *DirectComparableStruct { return oldObj.DirectComparableStructPtr }))...)
|
||||
|
||||
// field StructStruct.NonDirectComparableStructPtr
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NonDirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field nonDirectComparableStructPtrField")...)
|
||||
errs = append(errs, Validate_NonDirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("nonDirectComparableStructPtrField"), obj.NonDirectComparableStructPtr, safe.Field(oldObj, func(oldObj *StructStruct) *NonDirectComparableStruct { return oldObj.NonDirectComparableStructPtr }))...)
|
||||
|
||||
// field StructStruct.DirectComparableStruct
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *DirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field DirectComparableStruct")...)
|
||||
errs = append(errs, Validate_DirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(safe.Value(fldPath, func() *field.Path { return fldPath.Child("DirectComparableStruct") }), &obj.DirectComparableStruct, safe.Field(oldObj, func(oldObj *StructStruct) *DirectComparableStruct { return &oldObj.DirectComparableStruct }))...)
|
||||
|
||||
// field StructStruct.NonDirectComparableStruct
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NonDirectComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field NonDirectComparableStruct")...)
|
||||
errs = append(errs, Validate_NonDirectComparableStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(safe.Value(fldPath, func() *field.Path { return fldPath.Child("NonDirectComparableStruct") }), &obj.NonDirectComparableStruct, safe.Field(oldObj, func(oldObj *StructStruct) *NonDirectComparableStruct { return &oldObj.NonDirectComparableStruct }))...)
|
||||
|
||||
return errs
|
||||
}
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -90,6 +91,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.MT1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, Validate_T1)...)
|
||||
return
|
||||
}(fldPath.Child("mt1"), obj.MT1, safe.Field(oldObj, func(oldObj *T2) map[string]T1 { return oldObj.MT1 }))...)
|
||||
@@ -99,6 +103,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_T3(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T3) (errs field.ErrorList) {
|
||||
// type T3
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T3")...)
|
||||
|
||||
// field T3.T4
|
||||
@@ -115,6 +122,9 @@ func Validate_T4(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T4.MT3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]T3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, Validate_T3)...)
|
||||
return
|
||||
}(fldPath.Child("mt3"), obj.MT3, safe.Field(oldObj, func(oldObj *T4) map[string]T3 { return oldObj.MT3 }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -65,6 +66,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PT1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -82,6 +86,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PT2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -96,6 +103,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.PT1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -106,6 +116,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.PT2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -116,6 +129,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.PT3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -128,6 +144,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_T3(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T3) (errs field.ErrorList) {
|
||||
// type T3
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T3")...)
|
||||
|
||||
// field T3.I has no validation
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -90,6 +91,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T2.ST1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, Validate_T1)...)
|
||||
return
|
||||
}(fldPath.Child("st1"), obj.ST1, safe.Field(oldObj, func(oldObj *T2) []T1 { return oldObj.ST1 }))...)
|
||||
@@ -99,6 +103,9 @@ func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_T3(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T3) (errs field.ErrorList) {
|
||||
// type T3
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T3")...)
|
||||
|
||||
// field T3.T4
|
||||
@@ -115,6 +122,9 @@ func Validate_T4(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T4.ST3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []T3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, Validate_T3)...)
|
||||
return
|
||||
}(fldPath.Child("st3"), obj.ST3, safe.Field(oldObj, func(oldObj *T4) []T3 { return oldObj.ST3 }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct #1")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct #2")...)
|
||||
|
||||
@@ -57,6 +61,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField #1")...)
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField #2")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) {
|
||||
// type StringType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type StringType")...)
|
||||
|
||||
return errs
|
||||
@@ -56,6 +60,9 @@ func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *f
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -63,6 +70,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField[*]")
|
||||
@@ -73,6 +83,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []StringType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField[*]")
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
// type OtherStruct
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherStruct")...)
|
||||
|
||||
return errs
|
||||
@@ -56,6 +60,9 @@ func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *
|
||||
|
||||
func Validate_OtherTypedefStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherTypedefStruct) (errs field.ErrorList) {
|
||||
// type OtherTypedefStruct
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherTypedefStruct")...)
|
||||
|
||||
return errs
|
||||
@@ -63,6 +70,9 @@ func Validate_OtherTypedefStruct(ctx context.Context, op operation.Operation, fl
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -70,6 +80,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField[*]")
|
||||
@@ -81,6 +94,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherTypedefStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherTypedefStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField[*]")
|
||||
@@ -92,6 +108,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.UnvalidatedListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, Validate_OtherStruct)...)
|
||||
return
|
||||
}(fldPath.Child("UnvalidatedListField"), obj.UnvalidatedListField, safe.Field(oldObj, func(oldObj *Struct) []OtherStruct { return oldObj.UnvalidatedListField }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_ListType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj ListType) (errs field.ErrorList) {
|
||||
// type ListType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type ListType")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type ListType[*]")
|
||||
@@ -59,6 +63,9 @@ func Validate_ListType(ctx context.Context, op operation.Operation, fldPath *fie
|
||||
|
||||
func Validate_ListTypedefType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj ListTypedefType) (errs field.ErrorList) {
|
||||
// type ListTypedefType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type ListTypedefType")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type ListTypedefType[*]")
|
||||
@@ -70,6 +77,9 @@ func Validate_ListTypedefType(ctx context.Context, op operation.Operation, fldPa
|
||||
|
||||
func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) {
|
||||
// type StringType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type StringType")...)
|
||||
|
||||
return errs
|
||||
@@ -77,6 +87,9 @@ func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *f
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -84,6 +97,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj ListType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField[*]")
|
||||
@@ -95,6 +111,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj ListTypedefType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField[*]")
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "Struct.MapField(keys)")
|
||||
})...)
|
||||
@@ -62,6 +66,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[UnvalidatedStringType]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *UnvalidatedStringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "Struct.MapTypedefField(keys)")
|
||||
})...)
|
||||
@@ -71,6 +78,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapValidatedTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[ValidatedStringType]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *ValidatedStringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "Struct.MapValidatedTypedefField(keys)")
|
||||
})...)
|
||||
@@ -81,6 +91,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypeField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj UnvalidatedMapType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "Struct.MapTypeField(keys)")
|
||||
})...)
|
||||
@@ -90,6 +103,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ValidatedMapTypeField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj ValidatedMapType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "Struct.ValidatedMapTypeField(keys)")
|
||||
})...)
|
||||
@@ -102,6 +118,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
|
||||
func Validate_ValidatedMapType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj ValidatedMapType) (errs field.ErrorList) {
|
||||
// type ValidatedMapType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "ValidatedMapType(keys)")
|
||||
})...)
|
||||
@@ -111,6 +130,9 @@ func Validate_ValidatedMapType(ctx context.Context, op operation.Operation, fldP
|
||||
|
||||
func Validate_ValidatedStringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *ValidatedStringType) (errs field.ErrorList) {
|
||||
// type ValidatedStringType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "ValidatedStringType")...)
|
||||
|
||||
return errs
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField[*]")
|
||||
})...)
|
||||
@@ -62,6 +66,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]StringType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField[*]")
|
||||
})...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField[*]")
|
||||
})...)
|
||||
@@ -62,6 +66,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]OtherTypedefStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherTypedefStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField[*]")
|
||||
})...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField[*]")
|
||||
})...)
|
||||
@@ -62,6 +66,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []StringType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField[*]")
|
||||
})...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField[*]")
|
||||
})...)
|
||||
@@ -62,6 +66,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherTypedefStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherTypedefStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField[*]")
|
||||
})...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_MapType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) {
|
||||
// type MapType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapType[*]")
|
||||
})...)
|
||||
@@ -58,6 +62,9 @@ func Validate_MapType(ctx context.Context, op operation.Operation, fldPath *fiel
|
||||
|
||||
func Validate_MapTypedefType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj MapTypedefType) (errs field.ErrorList) {
|
||||
// type MapTypedefType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapTypedefType[*]")
|
||||
})...)
|
||||
@@ -68,6 +75,9 @@ func Validate_MapTypedefType(ctx context.Context, op operation.Operation, fldPat
|
||||
|
||||
func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) {
|
||||
// type StringType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type StringType")...)
|
||||
|
||||
return errs
|
||||
@@ -75,6 +85,9 @@ func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *f
|
||||
|
||||
func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *Struct) (errs field.ErrorList) {
|
||||
// type Struct
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type Struct")...)
|
||||
|
||||
// field Struct.TypeMeta has no validation
|
||||
@@ -82,6 +95,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapField[*]")
|
||||
})...)
|
||||
@@ -92,6 +108,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj MapTypedefType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapTypedefField[*]")
|
||||
})...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_ListType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj ListType) (errs field.ErrorList) {
|
||||
// type ListType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type ListType[*]")
|
||||
})...)
|
||||
@@ -58,6 +62,9 @@ func Validate_ListType(ctx context.Context, op operation.Operation, fldPath *fie
|
||||
|
||||
func Validate_ListTypedefType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj ListTypedefType) (errs field.ErrorList) {
|
||||
// type ListTypedefType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type ListTypedefType[*]")
|
||||
})...)
|
||||
@@ -71,6 +78,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj ListType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListField[*]")
|
||||
})...)
|
||||
@@ -81,6 +91,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj ListTypedefType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListTypedefField[*]")
|
||||
})...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_ImmutableType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *ImmutableType) (errs field.ErrorList) {
|
||||
// type ImmutableType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
|
||||
return errs
|
||||
@@ -60,6 +64,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("stringField"), &obj.StringField, safe.Field(oldObj, func(oldObj *Struct) *string { return &oldObj.StringField }))...)
|
||||
@@ -67,6 +74,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("stringPtrField"), obj.StringPtrField, safe.Field(oldObj, func(oldObj *Struct) *string { return oldObj.StringPtrField }))...)
|
||||
@@ -74,6 +84,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *ComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("structField"), &obj.StructField, safe.Field(oldObj, func(oldObj *Struct) *ComparableStruct { return &oldObj.StructField }))...)
|
||||
@@ -81,6 +94,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *ComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("structPtrField"), obj.StructPtrField, safe.Field(oldObj, func(oldObj *Struct) *ComparableStruct { return oldObj.StructPtrField }))...)
|
||||
@@ -88,6 +104,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.NonComparableStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NonComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("noncomparableStructField"), &obj.NonComparableStructField, safe.Field(oldObj, func(oldObj *Struct) *NonComparableStruct { return &oldObj.NonComparableStructField }))...)
|
||||
@@ -95,6 +114,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.NonComparableStructPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *NonComparableStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("noncomparableStructPtrField"), obj.NonComparableStructPtrField, safe.Field(oldObj, func(oldObj *Struct) *NonComparableStruct { return oldObj.NonComparableStructPtrField }))...)
|
||||
@@ -102,6 +124,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.SliceField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("sliceField"), obj.SliceField, safe.Field(oldObj, func(oldObj *Struct) []string { return oldObj.SliceField }))...)
|
||||
@@ -109,6 +134,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByReflect(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("mapField"), obj.MapField, safe.Field(oldObj, func(oldObj *Struct) map[string]string { return oldObj.MapField }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool {
|
||||
return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field
|
||||
}, validate.ImmutableByReflect)...)
|
||||
@@ -62,6 +66,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherTypedefStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherTypedefStruct, b OtherTypedefStruct) bool {
|
||||
return a.Key1Field == b.Key1Field && a.Key2Field == b.Key2Field
|
||||
}, validate.ImmutableByReflect)...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.KeyField == b.KeyField }, validate.ImmutableByReflect)...)
|
||||
return
|
||||
}(fldPath.Child("listField"), obj.ListField, safe.Field(oldObj, func(oldObj *Struct) []OtherStruct { return oldObj.ListField }))...)
|
||||
@@ -60,6 +64,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherTypedefStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherTypedefStruct, b OtherTypedefStruct) bool { return a.KeyField == b.KeyField }, validate.ImmutableByReflect)...)
|
||||
return
|
||||
}(fldPath.Child("listTypedefField"), obj.ListTypedefField, safe.Field(oldObj, func(oldObj *Struct) []OtherTypedefStruct { return oldObj.ListTypedefField }))...)
|
||||
|
||||
@@ -46,6 +46,16 @@ func Test(t *testing.T) {
|
||||
field.Invalid(field.NewPath("typedefField"), 0, content.MinError(1)),
|
||||
field.Invalid(field.NewPath("typedefPtrField"), 0, content.MinError(1)),
|
||||
)
|
||||
// Test validation ratcheting
|
||||
st.Value(&Struct{
|
||||
IntPtrField: ptr.To(0),
|
||||
UintPtrField: ptr.To(uint(0)),
|
||||
TypedefPtrField: ptr.To(IntType(0)),
|
||||
}).OldValue(&Struct{
|
||||
IntPtrField: ptr.To(0),
|
||||
UintPtrField: ptr.To(uint(0)),
|
||||
TypedefPtrField: ptr.To(IntType(0)),
|
||||
}).ExpectValid()
|
||||
|
||||
st.Value(&Struct{
|
||||
IntField: 1,
|
||||
|
||||
@@ -49,6 +49,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_IntType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) {
|
||||
// type IntType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
|
||||
return errs
|
||||
@@ -60,6 +63,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IntField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("intField"), &obj.IntField, safe.Field(oldObj, func(oldObj *Struct) *int { return &oldObj.IntField }))...)
|
||||
@@ -67,6 +73,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IntPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("intPtrField"), obj.IntPtrField, safe.Field(oldObj, func(oldObj *Struct) *int { return oldObj.IntPtrField }))...)
|
||||
@@ -74,6 +83,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.Int16Field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int16) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("int16Field"), &obj.Int16Field, safe.Field(oldObj, func(oldObj *Struct) *int16 { return &oldObj.Int16Field }))...)
|
||||
@@ -81,6 +93,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.Int32Field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int32) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("int32Field"), &obj.Int32Field, safe.Field(oldObj, func(oldObj *Struct) *int32 { return &oldObj.Int32Field }))...)
|
||||
@@ -88,6 +103,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.Int64Field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int64) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("int64Field"), &obj.Int64Field, safe.Field(oldObj, func(oldObj *Struct) *int64 { return &oldObj.Int64Field }))...)
|
||||
@@ -95,6 +113,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.UintField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *uint) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("uintField"), &obj.UintField, safe.Field(oldObj, func(oldObj *Struct) *uint { return &oldObj.UintField }))...)
|
||||
@@ -102,6 +123,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.UintPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *uint) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("uintPtrField"), obj.UintPtrField, safe.Field(oldObj, func(oldObj *Struct) *uint { return oldObj.UintPtrField }))...)
|
||||
@@ -109,6 +133,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.Uint16Field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *uint16) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("uint16Field"), &obj.Uint16Field, safe.Field(oldObj, func(oldObj *Struct) *uint16 { return &oldObj.Uint16Field }))...)
|
||||
@@ -116,6 +143,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.Uint32Field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *uint32) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("uint32Field"), &obj.Uint32Field, safe.Field(oldObj, func(oldObj *Struct) *uint32 { return &oldObj.Uint32Field }))...)
|
||||
@@ -123,6 +153,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.Uint64Field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *uint64) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
return
|
||||
}(fldPath.Child("uint64Field"), &obj.Uint64Field, safe.Field(oldObj, func(oldObj *Struct) *uint64 { return &oldObj.Uint64Field }))...)
|
||||
@@ -130,6 +163,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.TypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
errs = append(errs, Validate_IntType(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -138,6 +174,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.TypedefPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Minimum(ctx, op, fldPath, obj, oldObj, 1)...)
|
||||
errs = append(errs, Validate_IntType(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -77,6 +78,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_OtherString(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherString) (errs field.ErrorList) {
|
||||
// type OtherString
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherString")...)
|
||||
|
||||
return errs
|
||||
@@ -84,11 +88,17 @@ func Validate_OtherString(ctx context.Context, op operation.Operation, fldPath *
|
||||
|
||||
func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
// type OtherStruct
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherStruct")...)
|
||||
|
||||
// field OtherStruct.StringField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field OtherStruct.StringField")...)
|
||||
return
|
||||
}(fldPath.Child("stringField"), &obj.StringField, safe.Field(oldObj, func(oldObj *OtherStruct) *string { return &oldObj.StringField }))...)
|
||||
@@ -102,6 +112,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StructField")...)
|
||||
errs = append(errs, Validate_OtherStruct(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -110,6 +123,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -122,6 +138,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.OpaqueStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.OpaqueStructField")...)
|
||||
return
|
||||
}(fldPath.Child("opaqueStructField"), &obj.OpaqueStructField, safe.Field(oldObj, func(oldObj *Struct) *OtherStruct { return &oldObj.OpaqueStructField }))...)
|
||||
@@ -129,6 +148,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.OpaqueStructPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
return // do not proceed
|
||||
@@ -140,6 +162,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.SliceOfStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceOfStructField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceOfStructField vals")
|
||||
@@ -151,6 +176,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.SliceOfOpaqueStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceOfOpaqueStructField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.SliceOfOpaqueStructField vals")
|
||||
@@ -161,6 +189,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListMapOfStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListMapOfStructField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.StringField == b.StringField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListMapOfStructField vals")
|
||||
@@ -172,6 +203,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.ListMapOfOpaqueStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListMapOfOpaqueStructField")...)
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, func(a OtherStruct, b OtherStruct) bool { return a.StringField == b.StringField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.ListMapOfOpaqueStructField vals")
|
||||
@@ -182,6 +216,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapOfStringToStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[OtherString]OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherString) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapOfStringToStructField keys")
|
||||
})...)
|
||||
@@ -197,6 +234,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapOfStringToOpaqueStructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[OtherString]OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapKey(ctx, op, fldPath, obj, oldObj, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherString) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.MapOfStringToOpaqueStructField keys")
|
||||
})...)
|
||||
@@ -212,6 +252,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
|
||||
func Validate_TypedefMapOther(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj TypedefMapOther) (errs field.ErrorList) {
|
||||
// type TypedefMapOther
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "type TypedefMapOther")...)
|
||||
|
||||
return errs
|
||||
@@ -219,6 +262,9 @@ func Validate_TypedefMapOther(ctx context.Context, op operation.Operation, fldPa
|
||||
|
||||
func Validate_TypedefSliceOther(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj TypedefSliceOther) (errs field.ErrorList) {
|
||||
// type TypedefSliceOther
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "type TypedefSliceOther")...)
|
||||
|
||||
return errs
|
||||
|
||||
@@ -53,6 +53,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
@@ -64,6 +67,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
@@ -75,6 +81,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IntField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
@@ -86,6 +95,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IntPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
@@ -97,6 +109,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.BoolField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
@@ -108,6 +123,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.BoolPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
|
||||
@@ -54,12 +54,18 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
// optional value-type fields with zero-value defaults are purely documentation
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
return
|
||||
}(fldPath.Child("stringField"), &obj.StringField, safe.Field(oldObj, func(oldObj *Struct) *string { return &oldObj.StringField }))...)
|
||||
|
||||
// field Struct.StringPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
@@ -72,12 +78,18 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
// optional value-type fields with zero-value defaults are purely documentation
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
return
|
||||
}(fldPath.Child("intField"), &obj.IntField, safe.Field(oldObj, func(oldObj *Struct) *int { return &oldObj.IntField }))...)
|
||||
|
||||
// field Struct.IntPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
@@ -90,12 +102,18 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
// optional value-type fields with zero-value defaults are purely documentation
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
return
|
||||
}(fldPath.Child("boolField"), &obj.BoolField, safe.Field(oldObj, func(oldObj *Struct) *bool { return &oldObj.BoolField }))...)
|
||||
|
||||
// field Struct.BoolPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
// optional fields with default values are effectively required
|
||||
if e := validate.RequiredPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
errs = append(errs, e...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_IntType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) {
|
||||
// type IntType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type IntType")...)
|
||||
|
||||
return errs
|
||||
@@ -56,6 +60,9 @@ func Validate_IntType(ctx context.Context, op operation.Operation, fldPath *fiel
|
||||
|
||||
func Validate_MapType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) {
|
||||
// type MapType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type MapType")...)
|
||||
|
||||
return errs
|
||||
@@ -63,6 +70,9 @@ func Validate_MapType(ctx context.Context, op operation.Operation, fldPath *fiel
|
||||
|
||||
func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
// type OtherStruct
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type OtherStruct")...)
|
||||
|
||||
return errs
|
||||
@@ -70,6 +80,9 @@ func Validate_OtherStruct(ctx context.Context, op operation.Operation, fldPath *
|
||||
|
||||
func Validate_SliceType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj SliceType) (errs field.ErrorList) {
|
||||
// type SliceType
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type SliceType")...)
|
||||
|
||||
return errs
|
||||
@@ -77,6 +90,9 @@ func Validate_SliceType(ctx context.Context, op operation.Operation, fldPath *fi
|
||||
|
||||
func Validate_StringType(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) {
|
||||
// type StringType
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type StringType")...)
|
||||
|
||||
return errs
|
||||
@@ -88,6 +104,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -98,6 +117,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -108,6 +130,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -119,6 +144,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringTypedefPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *StringType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -130,6 +158,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IntField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -140,6 +171,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IntPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -150,6 +184,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IntTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalValue(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -161,6 +198,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IntTypedefPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *IntType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -172,6 +212,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.OtherStructPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalPointer(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -183,6 +226,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.SliceField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -193,6 +239,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.SliceTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj SliceType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalSlice(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -204,6 +253,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
@@ -214,6 +266,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.MapTypedefField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj MapType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
if e := validate.OptionalMap(ctx, op, fldPath, obj, oldObj); len(e) != 0 {
|
||||
return // do not proceed
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Subfield(ctx, op, fldPath, obj, oldObj, "structField", func(o *OtherStruct) *SmallStruct { return &o.StructField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *SmallStruct) field.ErrorList {
|
||||
return validate.Subfield(ctx, op, fldPath, obj, oldObj, "stringField", func(o *SmallStruct) *string { return &o.StringField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "StructField.StructField")
|
||||
@@ -78,6 +82,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Subfield(ctx, op, fldPath, obj, oldObj, "structField", func(o *OtherStruct) *SmallStruct { return &o.StructField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *SmallStruct) field.ErrorList {
|
||||
return validate.Subfield(ctx, op, fldPath, obj, oldObj, "stringField", func(o *SmallStruct) *string { return &o.StringField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "StructPtrField.StructField")
|
||||
|
||||
@@ -52,6 +52,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructType
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *other.StructType) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Subfield(ctx, op, fldPath, obj, oldObj, "stringField", func(o *other.StructType) *string { return &o.StringField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "subfield Struct.(other.StructType).StringField")
|
||||
})...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -53,6 +54,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Subfield(ctx, op, fldPath, obj, oldObj, "stringField", func(o *OtherStruct) *string { return &o.StringField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "subfield Struct.StructField.StringField")
|
||||
})...)
|
||||
@@ -74,6 +78,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StructPtrField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *OtherStruct) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.Subfield(ctx, op, fldPath, obj, oldObj, "stringField", func(o *OtherStruct) *string { return &o.StringField }, func(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *string) field.ErrorList {
|
||||
return validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "subfield Struct.StructPtrField.StringField")
|
||||
})...)
|
||||
|
||||
@@ -51,6 +51,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T1) *string { return &oldObj.S }))...)
|
||||
|
||||
@@ -51,6 +51,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T1) *string { return &oldObj.S }))...)
|
||||
|
||||
@@ -51,6 +51,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field T1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T1) *string { return &oldObj.S }))...)
|
||||
|
||||
@@ -28,10 +28,18 @@ func Test(t *testing.T) {
|
||||
}).ExpectValidateFalseByPath(map[string][]string{
|
||||
"stringField": {"field Struct.StringField"},
|
||||
})
|
||||
// Test validation ratcheting
|
||||
st.Value(&Struct{}).OldValue(&Struct{}).ExpectValid()
|
||||
|
||||
st.Value(&Struct{
|
||||
StringField: "abc",
|
||||
}).ExpectValidateFalseByPath(map[string][]string{
|
||||
"stringField": {"field Struct.StringField"},
|
||||
})
|
||||
// Test validation ratcheting
|
||||
st.Value(&Struct{
|
||||
StringField: "abc",
|
||||
}).OldValue(&Struct{
|
||||
StringField: "abc",
|
||||
}).ExpectValid()
|
||||
}
|
||||
|
||||
@@ -53,6 +53,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field Struct.StringField")...)
|
||||
return
|
||||
}(fldPath.Child("stringField"), &obj.StringField, safe.Field(oldObj, func(oldObj *Struct) *string { return &oldObj.StringField }))...)
|
||||
|
||||
@@ -53,6 +53,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.StringField
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, true, "field Struct.StringField")...)
|
||||
return
|
||||
}(fldPath.Child("stringField"), &obj.StringField, safe.Field(oldObj, func(oldObj *Struct) *string { return &oldObj.StringField }))...)
|
||||
|
||||
@@ -50,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_E1(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
// type E1
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type E1")...)
|
||||
|
||||
return errs
|
||||
@@ -61,6 +64,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.S1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *primitives.T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult[*primitives.T1](ctx, op, fldPath, obj, oldObj, false, "T1.S1")...)
|
||||
errs = append(errs, primitives.Validate_T1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -69,6 +75,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PS1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *primitives.T1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult[*primitives.T1](ctx, op, fldPath, obj, oldObj, false, "PT1.PS1")...)
|
||||
errs = append(errs, primitives.Validate_T1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -77,6 +86,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.E1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult[*E1](ctx, op, fldPath, obj, oldObj, false, "T1.E1")...)
|
||||
errs = append(errs, Validate_E1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -85,6 +97,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PE1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult[*E1](ctx, op, fldPath, obj, oldObj, true, "T1.PE1")...)
|
||||
errs = append(errs, Validate_E1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -93,6 +108,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.I1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult[*int](ctx, op, fldPath, obj, oldObj, false, "T1.I1")...)
|
||||
return
|
||||
}(fldPath.Child("i1"), &obj.I1, safe.Field(oldObj, func(oldObj *T1) *int { return &oldObj.I1 }))...)
|
||||
@@ -100,6 +118,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PI1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult[*int](ctx, op, fldPath, obj, oldObj, true, "T1.PI1")...)
|
||||
return
|
||||
}(fldPath.Child("pi1"), obj.PI1, safe.Field(oldObj, func(oldObj *T1) *int { return oldObj.PI1 }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -49,6 +50,9 @@ func RegisterValidations(scheme *testscheme.Scheme) error {
|
||||
|
||||
func Validate_E1(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
// type E1
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type E1")...)
|
||||
|
||||
return errs
|
||||
@@ -56,6 +60,9 @@ func Validate_E1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_E2(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E2) (errs field.ErrorList) {
|
||||
// type E2
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type E2")...)
|
||||
|
||||
return errs
|
||||
@@ -63,6 +70,9 @@ func Validate_E2(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_E3(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E3) (errs field.ErrorList) {
|
||||
// type E3
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type E3")...)
|
||||
|
||||
return errs
|
||||
@@ -70,11 +80,17 @@ func Validate_E3(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_E4(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *E4) (errs field.ErrorList) {
|
||||
// type E4
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type E4")...)
|
||||
|
||||
// field E4.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *E4) *string { return &oldObj.S }))...)
|
||||
@@ -84,6 +100,9 @@ func Validate_E4(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T1) (errs field.ErrorList) {
|
||||
// type T1
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T1")...)
|
||||
|
||||
// field T1.TypeMeta has no validation
|
||||
@@ -91,6 +110,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.E1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.E1")...)
|
||||
errs = append(errs, Validate_E1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -99,6 +121,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PE1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PE1")...)
|
||||
errs = append(errs, Validate_E1(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -107,6 +132,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.E2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.E2")...)
|
||||
errs = append(errs, Validate_E2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -115,6 +143,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PE2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PE2")...)
|
||||
errs = append(errs, Validate_E2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -123,6 +154,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.E3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.E3")...)
|
||||
errs = append(errs, Validate_E3(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -131,6 +165,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PE3
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E3) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PE3")...)
|
||||
errs = append(errs, Validate_E3(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -139,6 +176,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.E4
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E4) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.E4")...)
|
||||
errs = append(errs, Validate_E4(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -147,6 +187,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PE4
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *E4) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PE4")...)
|
||||
errs = append(errs, Validate_E4(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -155,6 +198,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.T2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.T2")...)
|
||||
errs = append(errs, Validate_T2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -163,6 +209,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.PT2
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T1.PT2")...)
|
||||
errs = append(errs, Validate_T2(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
@@ -173,11 +222,17 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
|
||||
func Validate_T2(ctx context.Context, op operation.Operation, fldPath *field.Path, obj, oldObj *T2) (errs field.ErrorList) {
|
||||
// type T2
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "type T2")...)
|
||||
|
||||
// field T2.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "field T2.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *T2) *string { return &oldObj.S }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -58,6 +59,9 @@ func Validate_M1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field M1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "M1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *M1) *string { return &oldObj.S }))...)
|
||||
@@ -69,6 +73,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.LM1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj []M1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachSliceVal(ctx, op, fldPath, obj, oldObj, nil, Validate_M1)...)
|
||||
return
|
||||
}(fldPath.Child("lm1"), obj.LM1, safe.Field(oldObj, func(oldObj *T1) []M1 { return oldObj.LM1 }))...)
|
||||
|
||||
@@ -25,6 +25,7 @@ import (
|
||||
context "context"
|
||||
fmt "fmt"
|
||||
|
||||
equality "k8s.io/apimachinery/pkg/api/equality"
|
||||
operation "k8s.io/apimachinery/pkg/api/operation"
|
||||
safe "k8s.io/apimachinery/pkg/api/safe"
|
||||
validate "k8s.io/apimachinery/pkg/api/validate"
|
||||
@@ -58,6 +59,9 @@ func Validate_M1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field M1.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.FixedResult(ctx, op, fldPath, obj, oldObj, false, "M1.S")...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *M1) *string { return &oldObj.S }))...)
|
||||
@@ -69,6 +73,9 @@ func Validate_T1(ctx context.Context, op operation.Operation, fldPath *field.Pat
|
||||
// field T1.MSM1
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj map[string]M1) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && equality.Semantic.DeepEqual(obj, oldObj) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.EachMapVal(ctx, op, fldPath, obj, oldObj, Validate_M1)...)
|
||||
return
|
||||
}(fldPath.Child("msm1"), obj.MSM1, safe.Field(oldObj, func(oldObj *T1) map[string]M1 { return oldObj.MSM1 }))...)
|
||||
|
||||
@@ -51,6 +51,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.SP
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("sp"), obj.SP, safe.Field(oldObj, func(oldObj *Struct) *string { return oldObj.SP }))...)
|
||||
@@ -58,6 +61,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.IP
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("ip"), obj.IP, safe.Field(oldObj, func(oldObj *Struct) *int { return oldObj.IP }))...)
|
||||
@@ -65,6 +71,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.BP
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("bp"), obj.BP, safe.Field(oldObj, func(oldObj *Struct) *bool { return oldObj.BP }))...)
|
||||
@@ -72,6 +81,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.FP
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *float64) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("fp"), obj.FP, safe.Field(oldObj, func(oldObj *Struct) *float64 { return oldObj.FP }))...)
|
||||
|
||||
@@ -51,6 +51,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.S
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *string) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("s"), &obj.S, safe.Field(oldObj, func(oldObj *Struct) *string { return &oldObj.S }))...)
|
||||
@@ -58,6 +61,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.I
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *int) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("i"), &obj.I, safe.Field(oldObj, func(oldObj *Struct) *int { return &oldObj.I }))...)
|
||||
@@ -65,6 +71,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.B
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *bool) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("b"), &obj.B, safe.Field(oldObj, func(oldObj *Struct) *bool { return &oldObj.B }))...)
|
||||
@@ -72,6 +81,9 @@ func Validate_Struct(ctx context.Context, op operation.Operation, fldPath *field
|
||||
// field Struct.F
|
||||
errs = append(errs,
|
||||
func(fldPath *field.Path, obj, oldObj *float64) (errs field.ErrorList) {
|
||||
if op.Type == operation.Update && (obj == oldObj || (obj != nil && oldObj != nil && *obj == *oldObj)) {
|
||||
return nil // no changes
|
||||
}
|
||||
errs = append(errs, validate.ImmutableByCompare(ctx, op, fldPath, obj, oldObj)...)
|
||||
return
|
||||
}(fldPath.Child("f"), &obj.F, safe.Field(oldObj, func(oldObj *Struct) *float64 { return &oldObj.F }))...)
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
/*
|
||||
Copyright 2025 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package util
|
||||
|
||||
import (
|
||||
"k8s.io/gengo/v2/parser/tags"
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
// GetMemberByJSON returns the child member of the type that has the given JSON
|
||||
// name. It returns nil if no such member exists.
|
||||
func GetMemberByJSON(t *types.Type, jsonName string) *types.Member {
|
||||
for i := range t.Members {
|
||||
if jsonTag, ok := tags.LookupJSON(t.Members[i]); ok {
|
||||
if jsonTag.Name == jsonName {
|
||||
return &t.Members[i]
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// IsNilableType returns true if the argument type can be compared to nil.
|
||||
func IsNilableType(t *types.Type) bool {
|
||||
t = NativeType(t)
|
||||
|
||||
switch t.Kind {
|
||||
case types.Pointer, types.Map, types.Slice, types.Interface: // Note: Arrays are not nilable
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// NativeType returns the Go native type of the argument type, with any
|
||||
// intermediate typedefs removed. Go itself already flattens typedefs, but this
|
||||
// handles it in the unlikely event that we ever fix that.
|
||||
//
|
||||
// Examples:
|
||||
// * Trivial:
|
||||
// - given `int`, returns `int`
|
||||
// - given `*int`, returns `*int`
|
||||
// - given `[]int`, returns `[]int`
|
||||
//
|
||||
// * Typedefs
|
||||
// - given `type X int; X`, returns `int`
|
||||
// - given `type X int; []X`, returns `[]X`
|
||||
//
|
||||
// * Typedefs and pointers:
|
||||
// - given `type X int; *X`, returns `*int`
|
||||
// - given `type X *int; *X`, returns `**int`
|
||||
// - given `type X []int; X`, returns `[]int`
|
||||
// - given `type X []int; *X`, returns `*[]int`
|
||||
func NativeType(t *types.Type) *types.Type {
|
||||
ptrs := 0
|
||||
for {
|
||||
switch t.Kind {
|
||||
case types.Alias:
|
||||
t = t.Underlying
|
||||
case types.Pointer:
|
||||
ptrs++
|
||||
t = t.Elem
|
||||
default:
|
||||
goto done
|
||||
}
|
||||
}
|
||||
done:
|
||||
for range ptrs {
|
||||
t = types.PointerTo(t)
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
// NonPointer returns the value-type of a possibly pointer type. If type is not
|
||||
// a pointer, it returns the input type.
|
||||
func NonPointer(t *types.Type) *types.Type {
|
||||
for t.Kind == types.Pointer {
|
||||
t = t.Elem
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
// IsDirectComparable returns true if the type is safe to compare using "==".
|
||||
// It is similar to gengo.IsComparable, but it doesn't consider Pointers to be
|
||||
// comparable (we don't want shallow compare).
|
||||
func IsDirectComparable(t *types.Type) bool {
|
||||
switch t.Kind {
|
||||
case types.Builtin:
|
||||
return true
|
||||
case types.Struct:
|
||||
for _, f := range t.Members {
|
||||
if !IsDirectComparable(f.Type) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
case types.Array:
|
||||
return IsDirectComparable(t.Elem)
|
||||
case types.Alias:
|
||||
return IsDirectComparable(t.Underlying)
|
||||
}
|
||||
return false
|
||||
}
|
||||
@@ -0,0 +1,454 @@
|
||||
/*
|
||||
Copyright 2025 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package util
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
func TestGetMemberByJSON(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
t *types.Type
|
||||
jsonTag string
|
||||
want *types.Member
|
||||
wantBool bool
|
||||
}{{
|
||||
name: "exact match",
|
||||
t: &types.Type{
|
||||
Members: []types.Member{
|
||||
{Name: "Field0", Tags: `json:"field0"`},
|
||||
{Name: "Field1", Tags: `json:"field1"`},
|
||||
{Name: "Field2", Tags: `json:"field2"`},
|
||||
},
|
||||
},
|
||||
jsonTag: "field1",
|
||||
want: &types.Member{Name: "Field1", Tags: `json:"field1"`},
|
||||
wantBool: true,
|
||||
}, {
|
||||
name: "no match",
|
||||
t: &types.Type{
|
||||
Members: []types.Member{
|
||||
{Name: "Field0", Tags: `json:"field0"`},
|
||||
{Name: "Field1", Tags: `json:"field1"`},
|
||||
},
|
||||
},
|
||||
jsonTag: "field2",
|
||||
want: nil,
|
||||
wantBool: false,
|
||||
}}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got := GetMemberByJSON(tt.t, tt.jsonTag)
|
||||
if !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("GetMemberByJSON() got %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsNilableType(t *testing.T) {
|
||||
tStruct := &types.Type{
|
||||
Name: types.Name{Name: "MyStruct"},
|
||||
Kind: types.Struct,
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
t *types.Type
|
||||
want bool
|
||||
}{{
|
||||
name: "pointer",
|
||||
t: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: tStruct,
|
||||
},
|
||||
want: true,
|
||||
}, {
|
||||
name: "alias to pointer",
|
||||
t: &types.Type{
|
||||
Kind: types.Alias,
|
||||
Underlying: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: tStruct,
|
||||
},
|
||||
},
|
||||
want: true,
|
||||
}, {
|
||||
name: "map",
|
||||
t: &types.Type{
|
||||
Kind: types.Map,
|
||||
},
|
||||
want: true,
|
||||
}, {
|
||||
name: "alias to map",
|
||||
t: &types.Type{
|
||||
Kind: types.Alias,
|
||||
Underlying: &types.Type{
|
||||
Kind: types.Map,
|
||||
},
|
||||
},
|
||||
want: true,
|
||||
}, {
|
||||
name: "slice",
|
||||
t: &types.Type{
|
||||
Kind: types.Slice,
|
||||
},
|
||||
want: true,
|
||||
}, {
|
||||
name: "alias to slice",
|
||||
t: &types.Type{
|
||||
Kind: types.Alias,
|
||||
Underlying: &types.Type{
|
||||
Kind: types.Slice,
|
||||
},
|
||||
},
|
||||
want: true,
|
||||
}, {
|
||||
name: "interface",
|
||||
t: &types.Type{
|
||||
Kind: types.Interface,
|
||||
},
|
||||
want: true,
|
||||
}, {
|
||||
name: "alias to interface",
|
||||
t: &types.Type{
|
||||
Kind: types.Alias,
|
||||
Underlying: &types.Type{
|
||||
Kind: types.Interface,
|
||||
},
|
||||
},
|
||||
want: true,
|
||||
}, {
|
||||
name: "struct",
|
||||
t: &types.Type{
|
||||
Kind: types.Struct,
|
||||
},
|
||||
want: false,
|
||||
}, {
|
||||
name: "alias to struct",
|
||||
t: &types.Type{
|
||||
Kind: types.Alias,
|
||||
Underlying: &types.Type{
|
||||
Kind: types.Struct,
|
||||
},
|
||||
},
|
||||
want: false,
|
||||
}, {
|
||||
name: "builtin",
|
||||
t: &types.Type{
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
want: false,
|
||||
}, {
|
||||
name: "alias to builtin",
|
||||
t: &types.Type{
|
||||
Kind: types.Alias,
|
||||
Underlying: &types.Type{
|
||||
Kind: types.Builtin,
|
||||
},
|
||||
},
|
||||
want: false,
|
||||
}}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := IsNilableType(tt.t); got != tt.want {
|
||||
t.Errorf("IsNilableType() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNativeType(t *testing.T) {
|
||||
tStruct := &types.Type{
|
||||
Name: types.Name{Name: "MyStruct"},
|
||||
Kind: types.Struct,
|
||||
}
|
||||
pStruct := &types.Type{
|
||||
Name: types.Name{Name: "*MyStruct"},
|
||||
Kind: types.Pointer,
|
||||
Elem: tStruct,
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
t *types.Type
|
||||
want *types.Type
|
||||
}{{
|
||||
name: "struct",
|
||||
t: tStruct,
|
||||
want: tStruct,
|
||||
}, {
|
||||
name: "pointer to struct",
|
||||
t: pStruct,
|
||||
want: pStruct,
|
||||
}, {
|
||||
name: "alias to struct",
|
||||
t: &types.Type{
|
||||
Name: types.Name{Name: "Alias"},
|
||||
Kind: types.Alias,
|
||||
Underlying: tStruct,
|
||||
},
|
||||
want: tStruct,
|
||||
}, {
|
||||
name: "pointer to alias to struct",
|
||||
t: &types.Type{
|
||||
Name: types.Name{Name: "*Alias"},
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{
|
||||
Kind: types.Alias,
|
||||
Underlying: tStruct,
|
||||
},
|
||||
},
|
||||
want: pStruct,
|
||||
}, {
|
||||
name: "alias of pointer to struct",
|
||||
t: &types.Type{
|
||||
Name: types.Name{Name: "AliasP"},
|
||||
Kind: types.Alias,
|
||||
Underlying: pStruct,
|
||||
},
|
||||
want: pStruct,
|
||||
}, {
|
||||
name: "pointer to alias of pointer to struct",
|
||||
t: &types.Type{
|
||||
Name: types.Name{Name: "*AliasP"},
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{
|
||||
Name: types.Name{Name: "AliasP"},
|
||||
Kind: types.Alias,
|
||||
Underlying: pStruct,
|
||||
},
|
||||
},
|
||||
want: &types.Type{
|
||||
Name: types.Name{Name: "**MyStruct"},
|
||||
Kind: types.Pointer,
|
||||
Elem: pStruct,
|
||||
},
|
||||
}}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if want, got := tt.want.String(), NativeType(tt.t).String(); want != got {
|
||||
t.Errorf("NativeType() = %q, want %q", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNonPointer(t *testing.T) {
|
||||
tStruct := &types.Type{
|
||||
Name: types.Name{Name: "MyStruct"},
|
||||
Kind: types.Struct,
|
||||
}
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
t *types.Type
|
||||
want *types.Type
|
||||
}{{
|
||||
name: "value",
|
||||
t: tStruct,
|
||||
want: tStruct,
|
||||
}, {
|
||||
name: "pointer",
|
||||
t: &types.Type{
|
||||
Name: types.Name{Name: "*MyStruct"},
|
||||
Kind: types.Pointer,
|
||||
Elem: tStruct,
|
||||
},
|
||||
want: tStruct,
|
||||
}, {
|
||||
name: "pointer pointer",
|
||||
t: &types.Type{
|
||||
Name: types.Name{Name: "**MyStruct"},
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{
|
||||
Kind: types.Pointer,
|
||||
Elem: tStruct,
|
||||
},
|
||||
},
|
||||
want: tStruct,
|
||||
}, {
|
||||
name: "pointer alias pointer",
|
||||
t: &types.Type{
|
||||
Name: types.Name{Name: "*AliasP"},
|
||||
Kind: types.Pointer,
|
||||
Elem: &types.Type{
|
||||
Name: types.Name{Name: "AliasP"},
|
||||
Kind: types.Alias,
|
||||
Underlying: &types.Type{
|
||||
Name: types.Name{Name: "*MyStruct"},
|
||||
Kind: types.Pointer,
|
||||
Elem: tStruct,
|
||||
},
|
||||
},
|
||||
},
|
||||
want: &types.Type{
|
||||
Name: types.Name{Name: "AliasP"},
|
||||
Kind: types.Alias,
|
||||
Underlying: &types.Type{
|
||||
Name: types.Name{Name: "*MyStruct"},
|
||||
Kind: types.Pointer,
|
||||
Elem: tStruct,
|
||||
},
|
||||
},
|
||||
}}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := NonPointer(tt.t); !reflect.DeepEqual(got, tt.want) {
|
||||
t.Errorf("NonPointer() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// gengo has `PointerTo()` but not the rest, so keep this here for consistency.
|
||||
func ptrTo(t *types.Type) *types.Type {
|
||||
return &types.Type{
|
||||
Name: types.Name{
|
||||
Package: "",
|
||||
Name: "*" + t.Name.String(),
|
||||
},
|
||||
Kind: types.Pointer,
|
||||
Elem: t,
|
||||
}
|
||||
}
|
||||
|
||||
func sliceOf(t *types.Type) *types.Type {
|
||||
return &types.Type{
|
||||
Name: types.Name{
|
||||
Package: "",
|
||||
Name: "[]" + t.Name.String(),
|
||||
},
|
||||
Kind: types.Slice,
|
||||
Elem: t,
|
||||
}
|
||||
}
|
||||
|
||||
func mapOf(t *types.Type) *types.Type {
|
||||
return &types.Type{
|
||||
Name: types.Name{
|
||||
Package: "",
|
||||
Name: "map[string]" + t.Name.String(),
|
||||
},
|
||||
Kind: types.Map,
|
||||
Key: types.String,
|
||||
Elem: t,
|
||||
}
|
||||
}
|
||||
|
||||
func arrayOf(t *types.Type) *types.Type {
|
||||
return &types.Type{
|
||||
Name: types.Name{
|
||||
Package: "",
|
||||
Name: "[2]" + t.Name.String(),
|
||||
},
|
||||
Kind: types.Array,
|
||||
Len: 2,
|
||||
Elem: t,
|
||||
}
|
||||
}
|
||||
|
||||
func aliasOf(name string, t *types.Type) *types.Type {
|
||||
return &types.Type{
|
||||
Name: types.Name{
|
||||
Package: "",
|
||||
Name: "Alias_" + name,
|
||||
},
|
||||
Kind: types.Alias,
|
||||
Underlying: t,
|
||||
}
|
||||
}
|
||||
|
||||
func TestIsDirectComparable(t *testing.T) {
|
||||
cases := []struct {
|
||||
in *types.Type
|
||||
expect bool
|
||||
}{
|
||||
{
|
||||
in: types.String,
|
||||
expect: true,
|
||||
}, {
|
||||
in: ptrTo(types.String),
|
||||
expect: false,
|
||||
}, {
|
||||
in: sliceOf(types.String),
|
||||
expect: false,
|
||||
}, {
|
||||
in: mapOf(types.String),
|
||||
expect: false,
|
||||
}, {
|
||||
in: aliasOf("s", types.String),
|
||||
expect: true,
|
||||
}, {
|
||||
in: &types.Type{
|
||||
Name: types.Name{
|
||||
Package: "",
|
||||
Name: "struct_comparable_member",
|
||||
},
|
||||
Kind: types.Struct,
|
||||
Members: []types.Member{
|
||||
{
|
||||
Name: "s",
|
||||
Type: types.String,
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: true,
|
||||
}, {
|
||||
in: &types.Type{
|
||||
Name: types.Name{
|
||||
Package: "",
|
||||
Name: "struct_uncomparable_member",
|
||||
},
|
||||
Kind: types.Struct,
|
||||
Members: []types.Member{
|
||||
{
|
||||
Name: "s",
|
||||
Type: ptrTo(types.String),
|
||||
},
|
||||
},
|
||||
},
|
||||
expect: false,
|
||||
}, {
|
||||
in: arrayOf(types.String),
|
||||
expect: true,
|
||||
}, {
|
||||
in: arrayOf(aliasOf("s", types.String)),
|
||||
expect: true,
|
||||
}, {
|
||||
in: arrayOf(ptrTo(types.String)),
|
||||
expect: false,
|
||||
}, {
|
||||
in: arrayOf(mapOf(types.String)),
|
||||
expect: false,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
if got, want := IsDirectComparable(tc.in), tc.expect; got != want {
|
||||
t.Errorf("%q: expected %v, got %v", tc.in, want, got)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,6 +29,7 @@ import (
|
||||
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||
"k8s.io/code-generator/cmd/validation-gen/util"
|
||||
"k8s.io/code-generator/cmd/validation-gen/validators"
|
||||
"k8s.io/gengo/v2/generator"
|
||||
"k8s.io/gengo/v2/namer"
|
||||
@@ -52,9 +53,11 @@ var (
|
||||
safePkg = "k8s.io/apimachinery/pkg/api/safe"
|
||||
safePkgSymbols = mkPkgNames(safePkg, "Field", "Cast", "Value")
|
||||
operationPkg = "k8s.io/apimachinery/pkg/api/operation"
|
||||
operationPkgSymbols = mkPkgNames(operationPkg, "Operation", "MatchesSubresource")
|
||||
operationPkgSymbols = mkPkgNames(operationPkg, "Operation", "MatchesSubresource", "Update")
|
||||
contextPkg = "context"
|
||||
contextPkgSymbols = mkPkgNames(contextPkg, "Context")
|
||||
equalityPkg = "k8s.io/apimachinery/pkg/api/equality"
|
||||
equalityPkgSymbols = mkPkgNames(equalityPkg, "Semantic")
|
||||
)
|
||||
|
||||
// genValidations produces a file with autogenerated validations.
|
||||
@@ -219,14 +222,6 @@ func (td *typeDiscoverer) DiscoverType(t *types.Type) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// unalias returns the unaliased type.
|
||||
func unalias(t *types.Type) *types.Type {
|
||||
for t.Kind == types.Alias {
|
||||
t = t.Underlying
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
// discoverType walks the given type recursively and returns a typeNode
|
||||
// representing it. This does not distinguish between discovering a type
|
||||
// definition and discovering a field of a struct. The first time it
|
||||
@@ -255,7 +250,7 @@ func (td *typeDiscoverer) discoverType(t *types.Type, fldPath *field.Path) (*typ
|
||||
return nil, fmt.Errorf("field %s (%s): typedefs to pointers are not supported", fldPath.String(), t)
|
||||
}
|
||||
case types.Pointer:
|
||||
pointee := unalias(t.Elem)
|
||||
pointee := util.NativeType(t.Elem)
|
||||
switch pointee.Kind {
|
||||
case types.Pointer:
|
||||
return nil, fmt.Errorf("field %s (%s): pointers to pointers are not supported", fldPath.String(), t)
|
||||
@@ -267,23 +262,23 @@ func (td *typeDiscoverer) discoverType(t *types.Type, fldPath *field.Path) (*typ
|
||||
case types.Array:
|
||||
return nil, fmt.Errorf("field %s (%s): fixed-size arrays are not supported", fldPath.String(), t)
|
||||
case types.Slice:
|
||||
elem := unalias(t.Elem)
|
||||
elem := util.NativeType(t.Elem)
|
||||
switch elem.Kind {
|
||||
case types.Pointer:
|
||||
return nil, fmt.Errorf("field %s (%s): lists of pointers are not supported", fldPath.String(), t)
|
||||
case types.Slice:
|
||||
if unalias(elem.Elem) != types.Byte {
|
||||
if util.NativeType(elem.Elem) != types.Byte {
|
||||
return nil, fmt.Errorf("field %s (%s): lists of lists are not supported", fldPath.String(), t)
|
||||
}
|
||||
case types.Map:
|
||||
return nil, fmt.Errorf("field %s (%s): lists of maps are not supported", fldPath.String(), t)
|
||||
}
|
||||
case types.Map:
|
||||
key := unalias(t.Key)
|
||||
key := util.NativeType(t.Key)
|
||||
if key != types.String {
|
||||
return nil, fmt.Errorf("field %s (%s): maps with non-string keys are not supported", fldPath.String(), t)
|
||||
}
|
||||
elem := unalias(t.Elem)
|
||||
elem := util.NativeType(t.Elem)
|
||||
switch elem.Kind {
|
||||
case types.Pointer:
|
||||
return nil, fmt.Errorf("field %s (%s): maps of pointers are not supported", fldPath.String(), t)
|
||||
@@ -416,7 +411,7 @@ func (td *typeDiscoverer) discoverType(t *types.Type, fldPath *field.Path) (*typ
|
||||
// system, while preventing validation on them since that functionality is not yet
|
||||
// implemented. Once validation support for map-of-slices is added, this check should
|
||||
// be removed.
|
||||
if unalias(t).Kind == types.Map && unalias(t).Elem.Kind == types.Slice {
|
||||
if util.NativeType(t).Kind == types.Map && util.NativeType(t).Elem.Kind == types.Slice {
|
||||
return nil, fmt.Errorf("field %s: validation for map of slices is not supported", fldPath)
|
||||
}
|
||||
klog.V(5).InfoS("found type-attached validations", "n", validations.Len(), "type", t)
|
||||
@@ -595,7 +590,7 @@ func (td *typeDiscoverer) discoverStruct(thisNode *typeNode, fldPath *field.Path
|
||||
// system, while preventing validation on them since that functionality is not yet
|
||||
// implemented. Once validation support for map-of-slices is added, this check should
|
||||
// be removed.
|
||||
if unalias(childType).Kind == types.Map && unalias(childType).Elem.Kind == types.Slice {
|
||||
if util.NativeType(childType).Kind == types.Map && util.NativeType(childType).Elem.Kind == types.Slice {
|
||||
return fmt.Errorf("field %s: validation for map of slices is not supported", childPath)
|
||||
}
|
||||
child.fieldValidations.Add(validations)
|
||||
@@ -838,7 +833,7 @@ func (g *genValidations) emitRegisterFunction(c *generator.Context, schemeRegist
|
||||
"safe": mkSymbolArgs(c, safePkgSymbols),
|
||||
"context": mkSymbolArgs(c, contextPkgSymbols),
|
||||
}
|
||||
if !isNilableType(rootType) {
|
||||
if !util.IsNilableType(rootType) {
|
||||
targs["typePfx"] = "*"
|
||||
}
|
||||
|
||||
@@ -905,7 +900,7 @@ func (g *genValidations) emitValidationFunction(c *generator.Context, t *types.T
|
||||
"context": mkSymbolArgs(c, contextPkgSymbols),
|
||||
"objTypePfx": "*",
|
||||
}
|
||||
if isNilableType(t) {
|
||||
if util.IsNilableType(t) {
|
||||
targs["objTypePfx"] = ""
|
||||
}
|
||||
|
||||
@@ -958,6 +953,7 @@ func (g *genValidations) emitValidationForChild(c *generator.Context, thisChild
|
||||
}
|
||||
sw.Do("// type $.inType|raw$\n", targs)
|
||||
emitComments(validations.Comments, sw)
|
||||
emitRatchetingCheck(c, thisNode.valueType, sw)
|
||||
emitCallsToValidators(c, validations.Functions, sw)
|
||||
if thisNode.valueType.Kind == types.Alias {
|
||||
underlyingNode := thisNode.underlying.node
|
||||
@@ -1010,9 +1006,14 @@ func (g *genValidations) emitValidationForChild(c *generator.Context, thisChild
|
||||
bufsw := sw.Dup(buf)
|
||||
|
||||
validations := fld.fieldValidations
|
||||
|
||||
// fldRatchetingChecked is used to avoid emitting the ratcheting check multiple times.
|
||||
fldRatchetingChecked := false
|
||||
if !validations.Empty() {
|
||||
emitComments(validations.Comments, bufsw)
|
||||
emitRatchetingCheck(c, fld.childType, bufsw)
|
||||
emitCallsToValidators(c, validations.Functions, bufsw)
|
||||
fldRatchetingChecked = true
|
||||
}
|
||||
|
||||
// If the node is nil, this must be a type in a package we are not
|
||||
@@ -1028,6 +1029,10 @@ func (g *genValidations) emitValidationForChild(c *generator.Context, thisChild
|
||||
// validations, call its validation function.
|
||||
if validations := fld.fieldValIterations; g.hasValidations(fld.node.elem.node) && !validations.Empty() {
|
||||
emitComments(validations.Comments, bufsw)
|
||||
if !fldRatchetingChecked {
|
||||
emitRatchetingCheck(c, fld.childType, bufsw)
|
||||
fldRatchetingChecked = true
|
||||
}
|
||||
emitCallsToValidators(c, validations.Functions, bufsw)
|
||||
}
|
||||
// Descend into this field.
|
||||
@@ -1037,12 +1042,20 @@ func (g *genValidations) emitValidationForChild(c *generator.Context, thisChild
|
||||
// validations, call its validation function.
|
||||
if validations := fld.fieldKeyIterations; g.hasValidations(fld.node.key.node) && !validations.Empty() {
|
||||
emitComments(validations.Comments, bufsw)
|
||||
if !fldRatchetingChecked {
|
||||
emitRatchetingCheck(c, fld.childType, bufsw)
|
||||
fldRatchetingChecked = true
|
||||
}
|
||||
emitCallsToValidators(c, validations.Functions, bufsw)
|
||||
}
|
||||
// If this field is a map and the value-type has
|
||||
// validations, call its validation function.
|
||||
if validations := fld.fieldValIterations; g.hasValidations(fld.node.elem.node) && !validations.Empty() {
|
||||
emitComments(validations.Comments, bufsw)
|
||||
if !fldRatchetingChecked {
|
||||
emitRatchetingCheck(c, fld.childType, bufsw)
|
||||
fldRatchetingChecked = true
|
||||
}
|
||||
emitCallsToValidators(c, validations.Functions, bufsw)
|
||||
}
|
||||
// Descend into this field.
|
||||
@@ -1120,6 +1133,27 @@ func (g *genValidations) emitCallToOtherTypeFunc(c *generator.Context, node *typ
|
||||
sw.Do("errs = append(errs, $.funcName|raw$(ctx, op, fldPath, obj, oldObj)...)\n", targs)
|
||||
}
|
||||
|
||||
// emitRachetingCheck emits a equivalence check for default ratcheting.
|
||||
func emitRatchetingCheck(c *generator.Context, t *types.Type, sw *generator.SnippetWriter) {
|
||||
// Emit equivalence check for default ratcheting.
|
||||
// TODO: Need to have a follow-up PR to handle the default behavior
|
||||
// for slices and maps.
|
||||
targs := generator.Args{
|
||||
"operation": mkSymbolArgs(c, operationPkgSymbols),
|
||||
}
|
||||
// If the type is a builtin, we can use a simpler equality check when they are not nil.
|
||||
if util.IsDirectComparable(util.NonPointer(util.NativeType(t))) {
|
||||
_, exprPfx, _ := getLeafTypeAndPrefixes(t)
|
||||
targs["exprPfx"] = exprPfx
|
||||
sw.Do("if op.Type == $.operation.Update|raw$ && (obj == oldObj || (obj != nil && oldObj != nil && $.exprPfx$obj == $.exprPfx$oldObj)) {\n", targs)
|
||||
} else {
|
||||
targs["equality"] = mkSymbolArgs(c, equalityPkgSymbols)
|
||||
sw.Do("if op.Type == $.operation.Update|raw$ && $.equality.Semantic|raw$.DeepEqual(obj, oldObj) {\n", targs)
|
||||
}
|
||||
sw.Do(" return nil // no changes\n", nil)
|
||||
sw.Do("}\n", nil)
|
||||
}
|
||||
|
||||
// emitCallsToValidators emits calls to a list of validation functions for
|
||||
// a single field or type. validations is a list of functions to call, with
|
||||
// arguments.
|
||||
@@ -1334,7 +1368,7 @@ func toGolangSourceDataLiteral(sw *generator.SnippetWriter, c *generator.Context
|
||||
"objType": v.ObjType,
|
||||
"objTypePfx": "*",
|
||||
}
|
||||
if isNilableType(v.ObjType) {
|
||||
if util.IsNilableType(v.ObjType) {
|
||||
targs["objTypePfx"] = ""
|
||||
}
|
||||
|
||||
@@ -1431,16 +1465,6 @@ func toGolangSourceDataLiteral(sw *generator.SnippetWriter, c *generator.Context
|
||||
}
|
||||
}
|
||||
|
||||
// isNilableType returns true if the argument type can be compared to nil.
|
||||
func isNilableType(t *types.Type) bool {
|
||||
t = unalias(t)
|
||||
switch t.Kind {
|
||||
case types.Pointer, types.Map, types.Slice, types.Interface: // Note: Arrays are not nilable
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// getLeafTypeAndPrefixes returns the "leaf value type" for a given type, as
|
||||
// well as type and expression prefix strings for the input type. The type
|
||||
// prefix can be prepended to the given type's name to produce the nilable form
|
||||
@@ -1466,7 +1490,7 @@ func getLeafTypeAndPrefixes(inType *types.Type) (*types.Type, string, string) {
|
||||
nPtrs++
|
||||
leafType = leafType.Elem
|
||||
}
|
||||
if !isNilableType(leafType) {
|
||||
if !util.IsNilableType(leafType) {
|
||||
typePfx = "*"
|
||||
if nPtrs == 0 {
|
||||
exprPfx = "&"
|
||||
|
||||
@@ -17,7 +17,6 @@ limitations under the License.
|
||||
package validators
|
||||
|
||||
import (
|
||||
"k8s.io/gengo/v2/parser/tags"
|
||||
"k8s.io/gengo/v2/types"
|
||||
)
|
||||
|
||||
@@ -27,75 +26,6 @@ const (
|
||||
libValidationPkg = "k8s.io/apimachinery/pkg/api/validate"
|
||||
)
|
||||
|
||||
func getMemberByJSON(t *types.Type, jsonName string) *types.Member {
|
||||
for i := range t.Members {
|
||||
if jsonTag, ok := tags.LookupJSON(t.Members[i]); ok {
|
||||
if jsonTag.Name == jsonName {
|
||||
return &t.Members[i]
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// isNilableType returns true if the argument type can be compared to nil.
|
||||
func isNilableType(t *types.Type) bool {
|
||||
for t.Kind == types.Alias {
|
||||
t = t.Underlying
|
||||
}
|
||||
switch t.Kind {
|
||||
case types.Pointer, types.Map, types.Slice, types.Interface: // Note: Arrays are not nilable
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// nativeType returns the Go native type of the argument type, with any
|
||||
// intermediate typedefs removed. Go itself already flattens typedefs, but this
|
||||
// handles it in the unlikely event that we ever fix that.
|
||||
//
|
||||
// Examples:
|
||||
// * Trivial:
|
||||
// - given `int`, returns `int`
|
||||
// - given `*int`, returns `*int`
|
||||
// - given `[]int`, returns `[]int`
|
||||
//
|
||||
// * Typedefs
|
||||
// - given `type X int; X`, returns `int`
|
||||
// - given `type X int; []X`, returns `[]X`
|
||||
//
|
||||
// * Typedefs and pointers:
|
||||
// - given `type X int; *X`, returns `*int`
|
||||
// - given `type X *int; *X`, returns `**int`
|
||||
// - given `type X []int; X`, returns `[]int`
|
||||
// - given `type X []int; *X`, returns `*[]int`
|
||||
func nativeType(t *types.Type) *types.Type {
|
||||
ptrs := 0
|
||||
for {
|
||||
if t.Kind == types.Alias {
|
||||
t = t.Underlying
|
||||
} else if t.Kind == types.Pointer {
|
||||
ptrs++
|
||||
t = t.Elem
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
for range ptrs {
|
||||
t = types.PointerTo(t)
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
// nonPointer returns the value-type of a possibly pointer type. If type is not
|
||||
// a pointer, it returns the input type.
|
||||
func nonPointer(t *types.Type) *types.Type {
|
||||
for t.Kind == types.Pointer {
|
||||
t = t.Elem
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
// rootTypeString returns a string representation of the relationship between
|
||||
// src and dst types, for use in error messages.
|
||||
func rootTypeString(src, dst *types.Type) string {
|
||||
|
||||
@@ -24,6 +24,8 @@ import (
|
||||
"k8s.io/apimachinery/pkg/util/validation/field"
|
||||
"k8s.io/gengo/v2/codetags"
|
||||
"k8s.io/gengo/v2/types"
|
||||
|
||||
"k8s.io/code-generator/cmd/validation-gen/util"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -78,7 +80,7 @@ func (listTypeTagValidator) ValidScopes() sets.Set[Scope] {
|
||||
|
||||
func (lttv listTypeTagValidator) GetValidations(context Context, tag codetags.Tag) (Validations, error) {
|
||||
// NOTE: pointers to lists are not supported, so we should never see a pointer here.
|
||||
t := nativeType(context.Type)
|
||||
t := util.NativeType(context.Type)
|
||||
if t.Kind != types.Slice && t.Kind != types.Array {
|
||||
return Validations{}, fmt.Errorf("can only be used on list types")
|
||||
}
|
||||
@@ -88,7 +90,7 @@ func (lttv listTypeTagValidator) GetValidations(context Context, tag codetags.Ta
|
||||
// Allowed but no special handling.
|
||||
case "map":
|
||||
// NOTE: maps of pointers are not supported, so we should never see a pointer here.
|
||||
if nativeType(t.Elem).Kind != types.Struct {
|
||||
if util.NativeType(t.Elem).Kind != types.Struct {
|
||||
return Validations{}, fmt.Errorf("only lists of structs can be list-maps")
|
||||
}
|
||||
|
||||
@@ -138,19 +140,19 @@ func (listMapKeyTagValidator) ValidScopes() sets.Set[Scope] {
|
||||
|
||||
func (lmktv listMapKeyTagValidator) GetValidations(context Context, tag codetags.Tag) (Validations, error) {
|
||||
// NOTE: pointers to lists are not supported, so we should never see a pointer here.
|
||||
t := nativeType(context.Type)
|
||||
t := util.NativeType(context.Type)
|
||||
if t.Kind != types.Slice && t.Kind != types.Array {
|
||||
return Validations{}, fmt.Errorf("can only be used on list types")
|
||||
}
|
||||
// NOTE: lists of pointers are not supported, so we should never see a pointer here.
|
||||
if nativeType(t.Elem).Kind != types.Struct {
|
||||
if util.NativeType(t.Elem).Kind != types.Struct {
|
||||
return Validations{}, fmt.Errorf("only lists of structs can be list-maps")
|
||||
}
|
||||
|
||||
var fieldName string
|
||||
if memb := getMemberByJSON(nativeType(t.Elem), tag.Value); memb == nil {
|
||||
if memb := util.GetMemberByJSON(util.NativeType(t.Elem), tag.Value); memb == nil {
|
||||
return Validations{}, fmt.Errorf("no field for JSON name %q", tag.Value)
|
||||
} else if k := nativeType(memb.Type).Kind; k != types.Builtin {
|
||||
} else if k := util.NativeType(memb.Type).Kind; k != types.Builtin {
|
||||
return Validations{}, fmt.Errorf("only primitive types can be list-map keys (%s)", k)
|
||||
} else {
|
||||
fieldName = memb.Name
|
||||
@@ -210,7 +212,7 @@ var (
|
||||
|
||||
func (evtv eachValTagValidator) GetValidations(context Context, tag codetags.Tag) (Validations, error) {
|
||||
// NOTE: pointers to lists and maps are not supported, so we should never see a pointer here.
|
||||
t := nativeType(context.Type)
|
||||
t := util.NativeType(context.Type)
|
||||
switch t.Kind {
|
||||
case types.Slice, types.Array, types.Map:
|
||||
default:
|
||||
@@ -350,7 +352,7 @@ var (
|
||||
|
||||
func (ektv eachKeyTagValidator) GetValidations(context Context, tag codetags.Tag) (Validations, error) {
|
||||
// NOTE: pointers to lists are not supported, so we should never see a pointer here.
|
||||
t := nativeType(context.Type)
|
||||
t := util.NativeType(context.Type)
|
||||
if t.Kind != types.Map {
|
||||
return Validations{}, fmt.Errorf("can only be used on map types")
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ import (
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/gengo/v2/codetags"
|
||||
"k8s.io/gengo/v2/types"
|
||||
|
||||
"k8s.io/code-generator/cmd/validation-gen/util"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -52,7 +54,7 @@ var (
|
||||
func (immutableTagValidator) GetValidations(context Context, _ codetags.Tag) (Validations, error) {
|
||||
var result Validations
|
||||
|
||||
if nonPointer(nativeType(context.Type)).Kind == types.Builtin {
|
||||
if util.NonPointer(util.NativeType(context.Type)).Kind == types.Builtin {
|
||||
// This is a minor optimization to just compare primitive values when
|
||||
// possible. Slices and maps are not comparable, and structs might hold
|
||||
// pointer fields, which are directly comparable but not what we need.
|
||||
|
||||
@@ -23,6 +23,8 @@ import (
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/gengo/v2/codetags"
|
||||
"k8s.io/gengo/v2/types"
|
||||
|
||||
"k8s.io/code-generator/cmd/validation-gen/util"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -58,7 +60,7 @@ func (minimumTagValidator) GetValidations(context Context, tag codetags.Tag) (Va
|
||||
|
||||
// This tag can apply to value and pointer fields, as well as typedefs
|
||||
// (which should never be pointers). We need to check the concrete type.
|
||||
if t := nonPointer(nativeType(context.Type)); !types.IsInteger(t) {
|
||||
if t := util.NonPointer(util.NativeType(context.Type)); !types.IsInteger(t) {
|
||||
return result, fmt.Errorf("can only be used on integer types (%s)", rootTypeString(context.Type, t))
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@ import (
|
||||
"k8s.io/gengo/v2"
|
||||
"k8s.io/gengo/v2/codetags"
|
||||
"k8s.io/gengo/v2/types"
|
||||
|
||||
"k8s.io/code-generator/cmd/validation-gen/util"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -91,7 +93,7 @@ func (rtv requirednessTagValidator) doRequired(context Context) (Validations, er
|
||||
// originally defined as a value-type or a pointer-type in the API. This
|
||||
// one does. Since Go doesn't do partial specialization of templates, we
|
||||
// do manual dispatch here.
|
||||
switch nativeType(context.Type).Kind {
|
||||
switch util.NativeType(context.Type).Kind {
|
||||
case types.Slice:
|
||||
return Validations{Functions: []FunctionGen{Function(requiredTagName, ShortCircuit, requiredSliceValidator)}}, nil
|
||||
case types.Map:
|
||||
@@ -145,7 +147,7 @@ func (rtv requirednessTagValidator) doOptional(context Context) (Validations, er
|
||||
if hasDefault, zeroDefault, err := rtv.hasZeroDefault(context); err != nil {
|
||||
return Validations{}, err
|
||||
} else if hasDefault {
|
||||
if !isNilableType(context.Type) && zeroDefault {
|
||||
if !util.IsNilableType(context.Type) && zeroDefault {
|
||||
return Validations{Comments: []string{"optional value-type fields with zero-value defaults are purely documentation"}}, nil
|
||||
}
|
||||
validations, err := rtv.doRequired(context)
|
||||
@@ -162,7 +164,7 @@ func (rtv requirednessTagValidator) doOptional(context Context) (Validations, er
|
||||
// originally defined as a value-type or a pointer-type in the API. This
|
||||
// one does. Since Go doesn't do partial specialization of templates, we
|
||||
// do manual dispatch here.
|
||||
switch nativeType(context.Type).Kind {
|
||||
switch util.NativeType(context.Type).Kind {
|
||||
case types.Slice:
|
||||
return Validations{Functions: []FunctionGen{Function(optionalTagName, ShortCircuit|NonError, optionalSliceValidator)}}, nil
|
||||
case types.Map:
|
||||
@@ -183,7 +185,7 @@ func (rtv requirednessTagValidator) doOptional(context Context) (Validations, er
|
||||
// hasZeroDefault returns whether the field has a default value and whether
|
||||
// that default value is the zero value for the field's type.
|
||||
func (rtv requirednessTagValidator) hasZeroDefault(context Context) (bool, bool, error) {
|
||||
t := nonPointer(nativeType(context.Type))
|
||||
t := util.NonPointer(util.NativeType(context.Type))
|
||||
// This validator only applies to fields, so Member must be valid.
|
||||
tagsByName, err := gengo.ExtractFunctionStyleCommentTags("+", []string{defaultTagName}, context.Member.CommentLines)
|
||||
if err != nil {
|
||||
@@ -262,7 +264,7 @@ func (requirednessTagValidator) doForbidden(context Context) (Validations, error
|
||||
// optional check and short-circuit (but without error). Why? For
|
||||
// example, this prevents any further validation from trying to run on a
|
||||
// nil pointer.
|
||||
switch nativeType(context.Type).Kind {
|
||||
switch util.NativeType(context.Type).Kind {
|
||||
case types.Slice:
|
||||
return Validations{
|
||||
Functions: []FunctionGen{
|
||||
|
||||
@@ -22,6 +22,8 @@ import (
|
||||
"k8s.io/apimachinery/pkg/util/sets"
|
||||
"k8s.io/gengo/v2/codetags"
|
||||
"k8s.io/gengo/v2/types"
|
||||
|
||||
"k8s.io/code-generator/cmd/validation-gen/util"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -58,12 +60,12 @@ func (stv subfieldTagValidator) GetValidations(context Context, tag codetags.Tag
|
||||
args := tag.Args
|
||||
// This tag can apply to value and pointer fields, as well as typedefs
|
||||
// (which should never be pointers). We need to check the concrete type.
|
||||
t := nonPointer(nativeType(context.Type))
|
||||
t := util.NonPointer(util.NativeType(context.Type))
|
||||
if t.Kind != types.Struct {
|
||||
return Validations{}, fmt.Errorf("can only be used on struct types")
|
||||
}
|
||||
subname := args[0].Value
|
||||
submemb := getMemberByJSON(t, subname)
|
||||
submemb := util.GetMemberByJSON(t, subname)
|
||||
if submemb == nil {
|
||||
return Validations{}, fmt.Errorf("no field for json name %q", subname)
|
||||
}
|
||||
@@ -83,12 +85,12 @@ func (stv subfieldTagValidator) GetValidations(context Context, tag codetags.Tag
|
||||
|
||||
for _, vfn := range validations.Functions {
|
||||
nilableStructType := context.Type
|
||||
if !isNilableType(nilableStructType) {
|
||||
if !util.IsNilableType(nilableStructType) {
|
||||
nilableStructType = types.PointerTo(nilableStructType)
|
||||
}
|
||||
nilableFieldType := submemb.Type
|
||||
fieldExprPrefix := ""
|
||||
if !isNilableType(nilableFieldType) {
|
||||
if !util.IsNilableType(nilableFieldType) {
|
||||
nilableFieldType = types.PointerTo(nilableFieldType)
|
||||
fieldExprPrefix = "&"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user