Skip to content

Commit 72b140e

Browse files
committed
Test for type-level preserve-unknown-fields
This adds a test for type-level `pruning:PreserveUnknownFields` to the crd test.
1 parent 90f7678 commit 72b140e

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

Diff for: pkg/crd/testdata/cronjob_types.go

+35
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ limitations under the License.
2323
package cronjob
2424

2525
import (
26+
"encoding/json"
2627
"fmt"
2728

2829
batchv1beta1 "k8s.io/api/batch/v1beta1"
@@ -127,6 +128,9 @@ type CronJobSpec struct {
127128
// +kubebuilder:validation:nullable
128129
UnprunedEmbeddedResource runtime.RawExtension `json:"unprunedEmbeddedResource"`
129130

131+
// This tests that a type-level pruning maker works.
132+
UnprunedFromType Preserved `json:"unprunedFomType"`
133+
130134
// This tests that associative lists work.
131135
// +listType=map
132136
// +listMapKey=name
@@ -142,6 +146,37 @@ type CronJobSpec struct {
142146
StructWithSeveralFields NestedObject `json:"structWithSeveralFields"`
143147
}
144148

149+
// +kubebuilder:validation:Type=object
150+
// +kubebuilder:pruning:PreserveUnknownFields
151+
type Preserved struct {
152+
ConcreteField string `json:"concreteField"`
153+
Rest map[string]interface{} `json:"-"`
154+
}
155+
func (p *Preserved) UnmarshalJSON(data []byte) error {
156+
if err := json.Unmarshal(data, &p.Rest); err != nil {
157+
return err
158+
}
159+
conc, found := p.Rest["concreteField"]
160+
if !found {
161+
return nil
162+
}
163+
concStr, isStr := conc.(string)
164+
if !isStr {
165+
return fmt.Errorf("concreteField was not string")
166+
}
167+
delete(p.Rest, "concreteField")
168+
p.ConcreteField = concStr
169+
return nil
170+
}
171+
func (p *Preserved) MarshalJSON() ([]byte, error) {
172+
full := make(map[string]interface{}, len(p.Rest)+1)
173+
for k, v := range p.Rest {
174+
full[k] = v
175+
}
176+
full["concreteField"] = p.ConcreteField
177+
return json.Marshal(full)
178+
}
179+
145180
type NestedObject struct {
146181
Foo string `json:"foo"`
147182
Bar bool `json:"bar"`

Diff for: pkg/crd/testdata/testdata.kubebuilder.io_cronjobs.yaml

+10
Original file line numberDiff line numberDiff line change
@@ -5090,6 +5090,15 @@ spec:
50905090
type: object
50915091
x-kubernetes-embedded-resource: true
50925092
x-kubernetes-preserve-unknown-fields: true
5093+
unprunedFomType:
5094+
description: This tests that a type-level pruning maker works.
5095+
properties:
5096+
concreteField:
5097+
type: string
5098+
required:
5099+
- concreteField
5100+
type: object
5101+
x-kubernetes-preserve-unknown-fields: true
50935102
unprunedJSON:
50945103
properties:
50955104
bar:
@@ -5117,6 +5126,7 @@ spec:
51175126
- twoOfAKindPart0
51185127
- twoOfAKindPart1
51195128
- unprunedEmbeddedResource
5129+
- unprunedFomType
51205130
- unprunedJSON
51215131
type: object
51225132
status:

Diff for: pkg/rbac/zz_generated.markerhelp.go

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)