@@ -44,6 +44,15 @@ type Generator struct {
44
44
// Only works with the v1beta1 CRD version.
45
45
TrivialVersions bool `marker:",optional"`
46
46
47
+ // PreserveUnknownFields indicates whether or not we should turn off pruning.
48
+ //
49
+ // Left unspecified, it'll default to true when only a v1beta1 CRD is
50
+ // generated (to preserve compatibility with older versions of this tool),
51
+ // or false otherwise.
52
+ //
53
+ // It's required to be false for v1 CRDs.
54
+ PreserveUnknownFields * bool `marker:",optional"`
55
+
47
56
// MaxDescLen specifies the maximum description length for fields in CRD's OpenAPI schema.
48
57
//
49
58
// 0 indicates drop the description for all fields completely.
@@ -117,6 +126,20 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error {
117
126
}
118
127
}
119
128
129
+ // *If* we're only generating v1beta1 CRDs, default to `preserveUnknownFields: (unset)`
130
+ // for compatibility purposes. In any other case, default to false, since that's
131
+ // the sensible default and is required for v1.
132
+ v1beta1Only := len (crdVersions ) == 1 && crdVersions [0 ] == "v1beta1"
133
+ switch {
134
+ case (g .PreserveUnknownFields == nil || * g .PreserveUnknownFields ) && v1beta1Only :
135
+ crd := versionedCRDs [0 ].(* apiextlegacy.CustomResourceDefinition )
136
+ crd .Spec .PreserveUnknownFields = nil
137
+ case g .PreserveUnknownFields == nil , g .PreserveUnknownFields != nil && ! * g .PreserveUnknownFields :
138
+ // it'll be false here (coming from v1) -- leave it as such
139
+ default :
140
+ return fmt .Errorf ("you may only set PreserveUnknownFields to true with v1beta1 CRDs" )
141
+ }
142
+
120
143
for i , crd := range versionedCRDs {
121
144
var fileName string
122
145
if i == 0 {
0 commit comments