Skip to content

Commit 2c0f108

Browse files
crd: allow specifying spec.preserveUnknownFields
Reinstate crd:preserveUnknownFields option removed by #607 to allow specifying the value of deprecated spec.preserveUnknownFields CRD field. This is useful for updating CRDs that were automatically converted from v1beta1 version which had true as a default value and resulted in: ``` $ kubectl get crd foo.bar -o yaml | grep preserveUnknownFields preserveUnknownFields: true message: 'spec.preserveUnknownFields: Invalid value: true: must be false' ``` For #476
1 parent 69c634f commit 2c0f108

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

pkg/crd/gen.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,13 @@ type Generator struct {
8585

8686
// Year specifies the year to substitute for " YEAR" in the header file.
8787
Year string `marker:",optional"`
88+
89+
// PreserveUnknownFields indicates whether or not we should turn off pruning.
90+
//
91+
// Specifies spec.preserveUnknownFields value that is false and omitted by default.
92+
//
93+
// It's required to be false for v1 CRDs.
94+
PreserveUnknownFields *bool `marker:",optional"`
8895
}
8996

9097
func (Generator) CheckFilter() loader.NodeFilter {
@@ -100,6 +107,16 @@ func transformRemoveCRDStatus(obj map[string]interface{}) error {
100107
return nil
101108
}
102109

110+
// transformPreserveUnknownFields adds spec.preserveUnknownFields=value.
111+
func transformPreserveUnknownFields(value bool) func(map[string]interface{}) error {
112+
return func(obj map[string]interface{}) error {
113+
if spec, ok := obj["spec"].(map[interface{}]interface{}); ok {
114+
spec["preserveUnknownFields"] = value
115+
}
116+
return nil
117+
}
118+
}
119+
103120
func (g Generator) Generate(ctx *genall.GenerationContext) error {
104121
parser := &Parser{
105122
Collector: ctx.Collector,
@@ -146,6 +163,14 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error {
146163
}
147164
headerText = strings.ReplaceAll(headerText, " YEAR", " "+g.Year)
148165

166+
yamlOpts := []*genall.WriteYAMLOptions{
167+
genall.WithTransform(transformRemoveCRDStatus),
168+
genall.WithTransform(genall.TransformRemoveCreationTimestamp),
169+
}
170+
if g.PreserveUnknownFields != nil {
171+
yamlOpts = append(yamlOpts, genall.WithTransform(transformPreserveUnknownFields(*g.PreserveUnknownFields)))
172+
}
173+
149174
for _, groupKind := range kubeKinds {
150175
parser.NeedCRDFor(groupKind, g.MaxDescLen)
151176
crdRaw := parser.CustomResourceDefinitions[groupKind]
@@ -171,7 +196,7 @@ func (g Generator) Generate(ctx *genall.GenerationContext) error {
171196
} else {
172197
fileName = fmt.Sprintf("%s_%s.%s.yaml", crdRaw.Spec.Group, crdRaw.Spec.Names.Plural, crdVersions[i])
173198
}
174-
if err := ctx.WriteYAML(fileName, headerText, []interface{}{crd}, genall.WithTransform(transformRemoveCRDStatus), genall.WithTransform(genall.TransformRemoveCreationTimestamp)); err != nil {
199+
if err := ctx.WriteYAML(fileName, headerText, []interface{}{crd}, yamlOpts...); err != nil {
175200
return err
176201
}
177202
}

pkg/crd/gen_integration_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,43 @@ var _ = Describe("CRD Generation proper defaulting", func() {
119119
expectedOut := string(expectedFileFoos) + string(expectedFileZoos)
120120
Expect(out.buf.String()).To(Equal(expectedOut), cmp.Diff(out.buf.String(), expectedOut))
121121
})
122+
123+
It("should add preserveUnknownFields=false when specified", func() {
124+
By("calling Generate")
125+
no := false
126+
gen := &crd.Generator{
127+
CRDVersions: []string{"v1"},
128+
PreserveUnknownFields: &no,
129+
}
130+
Expect(gen.Generate(ctx)).NotTo(HaveOccurred())
131+
132+
By("searching preserveUnknownFields")
133+
Expect(out.buf.String()).To(ContainSubstring("preserveUnknownFields: false"))
134+
})
135+
136+
It("should add preserveUnknownFields=true when specified", func() {
137+
By("calling Generate")
138+
yes := true
139+
gen := &crd.Generator{
140+
CRDVersions: []string{"v1"},
141+
PreserveUnknownFields: &yes,
142+
}
143+
Expect(gen.Generate(ctx)).NotTo(HaveOccurred())
144+
145+
By("searching preserveUnknownFields")
146+
Expect(out.buf.String()).To(ContainSubstring("preserveUnknownFields: true"))
147+
})
148+
149+
It("should not add preserveUnknownFields when not specified", func() {
150+
By("calling Generate")
151+
gen := &crd.Generator{
152+
CRDVersions: []string{"v1"},
153+
}
154+
Expect(gen.Generate(ctx)).NotTo(HaveOccurred())
155+
156+
By("searching preserveUnknownFields")
157+
Expect(out.buf.String()).NotTo(ContainSubstring("preserveUnknownFields"))
158+
})
122159
})
123160

124161
// fixAnnotations fixes the attribution annotation for tests.

0 commit comments

Comments
 (0)