@@ -36,17 +36,33 @@ type CustomDefaulter interface {
36
36
Default (ctx context.Context , obj runtime.Object ) error
37
37
}
38
38
39
+ type defaulterOptions struct {
40
+ preserveUnknownFields bool
41
+ }
42
+
43
+ type defaulterOption func (* defaulterOptions )
44
+
45
+ // DefaulterPreserveUnknownFields stops the defaulter from pruning the fields that are not recognized in the local scheme.
46
+ func DefaulterPreserveUnknownFields (o * defaulterOptions ) {
47
+ o .preserveUnknownFields = true
48
+ }
49
+
39
50
// WithCustomDefaulter creates a new Webhook for a CustomDefaulter interface.
40
- func WithCustomDefaulter (scheme * runtime.Scheme , obj runtime.Object , defaulter CustomDefaulter ) * Webhook {
51
+ func WithCustomDefaulter (scheme * runtime.Scheme , obj runtime.Object , defaulter CustomDefaulter , opts ... defaulterOption ) * Webhook {
52
+ options := & defaulterOptions {}
53
+ for _ , o := range opts {
54
+ o (options )
55
+ }
41
56
return & Webhook {
42
- Handler : & defaulterForType {object : obj , defaulter : defaulter , decoder : NewDecoder (scheme )},
57
+ Handler : & defaulterForType {object : obj , defaulter : defaulter , decoder : NewDecoder (scheme ), preserveUnknownFields : options . preserveUnknownFields },
43
58
}
44
59
}
45
60
46
61
type defaulterForType struct {
47
- defaulter CustomDefaulter
48
- object runtime.Object
49
- decoder Decoder
62
+ defaulter CustomDefaulter
63
+ object runtime.Object
64
+ decoder Decoder
65
+ preserveUnknownFields bool
50
66
}
51
67
52
68
// Handle handles admission requests.
@@ -79,8 +95,11 @@ func (h *defaulterForType) Handle(ctx context.Context, req Request) Response {
79
95
return Errored (http .StatusBadRequest , err )
80
96
}
81
97
82
- // Keep a copy of the object
83
- originalObj := obj .DeepCopyObject ()
98
+ // Keep a copy of the object if needed
99
+ var originalObj runtime.Object
100
+ if h .preserveUnknownFields {
101
+ originalObj = obj .DeepCopyObject ()
102
+ }
84
103
85
104
// Default the object
86
105
if err := h .defaulter .Default (ctx , obj ); err != nil {
@@ -96,9 +115,12 @@ func (h *defaulterForType) Handle(ctx context.Context, req Request) Response {
96
115
if err != nil {
97
116
return Errored (http .StatusInternalServerError , err )
98
117
}
99
- handlerResponse := PatchResponseFromRaw (req .Object .Raw , marshalled )
100
118
101
- return h .dropSchemeRemovals (handlerResponse , originalObj , req .Object .Raw )
119
+ handlerResponse := PatchResponseFromRaw (req .Object .Raw , marshalled )
120
+ if h .preserveUnknownFields {
121
+ handlerResponse = h .dropSchemeRemovals (handlerResponse , originalObj , req .Object .Raw )
122
+ }
123
+ return handlerResponse
102
124
}
103
125
104
126
func (h * defaulterForType ) dropSchemeRemovals (r Response , original runtime.Object , raw []byte ) Response {
0 commit comments