diff --git a/pkg/crd/flatten.go b/pkg/crd/flatten.go index 2500971c0..d2db21543 100644 --- a/pkg/crd/flatten.go +++ b/pkg/crd/flatten.go @@ -145,6 +145,8 @@ func flattenAllOfInto(dst *apiext.JSONSchemaProps, src apiext.JSONSchemaProps, e flattenAllOfInto(dstProps.Schema, *srcProps.Schema, errRec) case "XMapType": dstField.Set(srcField) + case "XPreserveUnknownFields": + dstField.Set(srcField) // NB(directxman12): no need to explicitly handle nullable -- false is considered to be the zero value // TODO(directxman12): src isn't necessarily the field value -- it's just the most recent allOf entry default: diff --git a/pkg/crd/testdata/cronjob_types.go b/pkg/crd/testdata/cronjob_types.go index f20110f17..ef43d058b 100644 --- a/pkg/crd/testdata/cronjob_types.go +++ b/pkg/crd/testdata/cronjob_types.go @@ -134,9 +134,13 @@ type CronJobSpec struct { // +kubebuilder:validation:nullable UnprunedEmbeddedResource runtime.RawExtension `json:"unprunedEmbeddedResource"` - // This tests that a type-level pruning maker works. + // This tests that a type-level pruning marker works. UnprunedFromType Preserved `json:"unprunedFomType"` + // This tests that a type-level pruning marker combined with a field-level pruning marker works. + // +kubebuilder:pruning:PreserveUnknownFields + UnprunedFromTypeAndField Preserved `json:"unprunedFomTypeAndField"` + // This tests that associative lists work. // +listType=map // +listMapKey=name diff --git a/pkg/crd/testdata/testdata.kubebuilder.io_cronjobs.yaml b/pkg/crd/testdata/testdata.kubebuilder.io_cronjobs.yaml index f9306a518..ed54c221b 100644 --- a/pkg/crd/testdata/testdata.kubebuilder.io_cronjobs.yaml +++ b/pkg/crd/testdata/testdata.kubebuilder.io_cronjobs.yaml @@ -7385,7 +7385,12 @@ spec: x-kubernetes-embedded-resource: true x-kubernetes-preserve-unknown-fields: true unprunedFomType: - description: This tests that a type-level pruning maker works. + description: This tests that a type-level pruning marker works. + type: object + x-kubernetes-preserve-unknown-fields: true + unprunedFomTypeAndField: + description: This tests that a type-level pruning marker combined + with a field-level pruning marker works. type: object x-kubernetes-preserve-unknown-fields: true unprunedJSON: @@ -7425,6 +7430,7 @@ spec: - twoOfAKindPart1 - unprunedEmbeddedResource - unprunedFomType + - unprunedFomTypeAndField - unprunedJSON type: object status: