@@ -34,58 +34,69 @@ import (
34
34
"sigs.k8s.io/controller-runtime/pkg/webhook/conversion"
35
35
)
36
36
37
- // This code is copied from https://github.com/kubernetes-sigs/controller-runtime
38
- // with some modifications to get full control of the construction of patches.
37
+ // This code is copied from https://github.com/kubernetes-sigs/controller-runtime/blob/896f6ded750155f9ecfdf4d8e10a26fc3fb78384/pkg/builder/webhook.go
38
+ // with one modification to get full control of the construction of patches:
39
+ // replacing CustomDefaulter with an admission.Handler.
40
+ // TODO(#3137): remove this file
39
41
40
- // Builder builds a Webhook.
41
- type Builder struct {
42
+ // WebhookBuilder builds a Webhook.
43
+ type WebhookBuilder struct {
42
44
apiType runtime.Object
43
45
mutationHandler admission.Handler
44
46
customValidator admission.CustomValidator
45
47
gvk schema.GroupVersionKind
46
48
mgr manager.Manager
47
49
config * rest.Config
48
- recoverPanic bool
50
+ recoverPanic * bool
49
51
logConstructor func (base logr.Logger , req * admission.Request ) logr.Logger
52
+ err error
50
53
}
51
54
52
- // ManagedBy returns a new webhook builder.
53
- func ManagedBy (m manager.Manager ) * Builder {
54
- return & Builder {mgr : m }
55
+ // WebhookManagedBy returns a new webhook builder.
56
+ func WebhookManagedBy (m manager.Manager ) * WebhookBuilder {
57
+ return & WebhookBuilder {mgr : m }
55
58
}
56
59
60
+ // TODO(droot): update the GoDoc for conversion.
61
+
57
62
// For takes a runtime.Object which should be a CR.
58
- func (blder * Builder ) For (apiType runtime.Object ) * Builder {
63
+ // If the given object implements the admission.Defaulter interface, a MutatingWebhook will be wired for this type.
64
+ // If the given object implements the admission.Validator interface, a ValidatingWebhook will be wired for this type.
65
+ func (blder * WebhookBuilder ) For (apiType runtime.Object ) * WebhookBuilder {
66
+ if blder .apiType != nil {
67
+ blder .err = errors .New ("For(...) should only be called once, could not assign multiple objects for webhook registration" )
68
+ }
59
69
blder .apiType = apiType
60
70
return blder
61
71
}
62
72
63
- // WithMutationHandler takes an admission.Handler inteface , a MutationgWebhook will be wired for this type.
64
- func (blder * Builder ) WithMutationHandler (handler admission.Handler ) * Builder {
65
- blder .mutationHandler = handler
73
+ // WithDefaulter takes an admission.CustomDefaulter interface , a MutatingWebhook will be wired for this type.
74
+ func (blder * WebhookBuilder ) WithMutationHandler (h admission.Handler ) * WebhookBuilder {
75
+ blder .mutationHandler = h
66
76
return blder
67
77
}
68
78
69
79
// WithValidator takes a admission.CustomValidator interface, a ValidatingWebhook will be wired for this type.
70
- func (blder * Builder ) WithValidator (validator admission.CustomValidator ) * Builder {
80
+ func (blder * WebhookBuilder ) WithValidator (validator admission.CustomValidator ) * WebhookBuilder {
71
81
blder .customValidator = validator
72
82
return blder
73
83
}
74
84
75
85
// WithLogConstructor overrides the webhook's LogConstructor.
76
- func (blder * Builder ) WithLogConstructor (logConstructor func (base logr.Logger , req * admission.Request ) logr.Logger ) * Builder {
86
+ func (blder * WebhookBuilder ) WithLogConstructor (logConstructor func (base logr.Logger , req * admission.Request ) logr.Logger ) * WebhookBuilder {
77
87
blder .logConstructor = logConstructor
78
88
return blder
79
89
}
80
90
81
91
// RecoverPanic indicates whether panics caused by the webhook should be recovered.
82
- func (blder * Builder ) RecoverPanic () * Builder {
83
- blder .recoverPanic = true
92
+ // Defaults to true.
93
+ func (blder * WebhookBuilder ) RecoverPanic (recoverPanic bool ) * WebhookBuilder {
94
+ blder .recoverPanic = & recoverPanic
84
95
return blder
85
96
}
86
97
87
98
// Complete builds the webhook.
88
- func (blder * Builder ) Complete () error {
99
+ func (blder * WebhookBuilder ) Complete () error {
89
100
// Set the Config
90
101
blder .loadRestConfig ()
91
102
@@ -96,13 +107,13 @@ func (blder *Builder) Complete() error {
96
107
return blder .registerWebhooks ()
97
108
}
98
109
99
- func (blder * Builder ) loadRestConfig () {
110
+ func (blder * WebhookBuilder ) loadRestConfig () {
100
111
if blder .config == nil {
101
112
blder .config = blder .mgr .GetConfig ()
102
113
}
103
114
}
104
115
105
- func (blder * Builder ) setLogConstructor () {
116
+ func (blder * WebhookBuilder ) setLogConstructor () {
106
117
if blder .logConstructor == nil {
107
118
blder .logConstructor = func (base logr.Logger , req * admission.Request ) logr.Logger {
108
119
log := base .WithValues (
@@ -122,7 +133,7 @@ func (blder *Builder) setLogConstructor() {
122
133
}
123
134
}
124
135
125
- func (blder * Builder ) registerWebhooks () error {
136
+ func (blder * WebhookBuilder ) registerWebhooks () error {
126
137
typ , err := blder .getType ()
127
138
if err != nil {
128
139
return err
@@ -141,11 +152,11 @@ func (blder *Builder) registerWebhooks() error {
141
152
if err != nil {
142
153
return err
143
154
}
144
- return nil
155
+ return blder . err
145
156
}
146
157
147
158
// registerDefaultingWebhook registers a defaulting webhook if necessary.
148
- func (blder * Builder ) registerDefaultingWebhook () {
159
+ func (blder * WebhookBuilder ) registerDefaultingWebhook () {
149
160
mwh := blder .getDefaultingWebhook ()
150
161
if mwh != nil {
151
162
mwh .LogConstructor = blder .logConstructor
@@ -154,26 +165,30 @@ func (blder *Builder) registerDefaultingWebhook() {
154
165
// Checking if the path is already registered.
155
166
// If so, just skip it.
156
167
if ! blder .isAlreadyHandled (path ) {
157
- blder .mgr .GetLogger ().Info ("Registering a mutating webhook" ,
168
+ log := blder .mgr .GetLogger ()
169
+ log .Info ("Registering a mutating webhook" ,
158
170
"GVK" , blder .gvk ,
159
171
"path" , path )
160
172
blder .mgr .GetWebhookServer ().Register (path , mwh )
161
173
}
162
174
}
163
175
}
164
176
165
- func (blder * Builder ) getDefaultingWebhook () * admission.Webhook {
177
+ func (blder * WebhookBuilder ) getDefaultingWebhook () * admission.Webhook {
166
178
if handler := blder .mutationHandler ; handler != nil {
167
- return (& admission.Webhook {Handler : handler }).WithRecoverPanic (blder .recoverPanic )
179
+ w := & admission.Webhook {
180
+ Handler : handler ,
181
+ }
182
+ if blder .recoverPanic != nil {
183
+ w = w .WithRecoverPanic (* blder .recoverPanic )
184
+ }
185
+ return w
168
186
}
169
- blder .mgr .GetLogger ().Info (
170
- "skip registering a mutating webhook, WithMutationHandler wasn't called" ,
171
- "GVK" , blder .gvk )
172
187
return nil
173
188
}
174
189
175
190
// registerValidatingWebhook registers a validating webhook if necessary.
176
- func (blder * Builder ) registerValidatingWebhook () {
191
+ func (blder * WebhookBuilder ) registerValidatingWebhook () {
177
192
vwh := blder .getValidatingWebhook ()
178
193
if vwh != nil {
179
194
vwh .LogConstructor = blder .logConstructor
@@ -182,25 +197,27 @@ func (blder *Builder) registerValidatingWebhook() {
182
197
// Checking if the path is already registered.
183
198
// If so, just skip it.
184
199
if ! blder .isAlreadyHandled (path ) {
185
- blder .mgr .GetLogger ().Info ("Registering a validating webhook" ,
200
+ log := blder .mgr .GetLogger ()
201
+ log .Info ("Registering a validating webhook" ,
186
202
"GVK" , blder .gvk ,
187
203
"path" , path )
188
204
blder .mgr .GetWebhookServer ().Register (path , vwh )
189
205
}
190
206
}
191
207
}
192
208
193
- func (blder * Builder ) getValidatingWebhook () * admission.Webhook {
209
+ func (blder * WebhookBuilder ) getValidatingWebhook () * admission.Webhook {
194
210
if validator := blder .customValidator ; validator != nil {
195
- return admission .WithCustomValidator (blder .mgr .GetScheme (), blder .apiType , validator ).WithRecoverPanic (blder .recoverPanic )
211
+ w := admission .WithCustomValidator (blder .mgr .GetScheme (), blder .apiType , validator )
212
+ if blder .recoverPanic != nil {
213
+ w = w .WithRecoverPanic (* blder .recoverPanic )
214
+ }
215
+ return w
196
216
}
197
- blder .mgr .GetLogger ().Info (
198
- "skip registering a validating webhook, WithValidator wasn't called" ,
199
- "GVK" , blder .gvk )
200
217
return nil
201
218
}
202
219
203
- func (blder * Builder ) registerConversionWebhook () error {
220
+ func (blder * WebhookBuilder ) registerConversionWebhook () error {
204
221
log := blder .mgr .GetLogger ()
205
222
ok , err := conversion .IsConvertible (blder .mgr .GetScheme (), blder .apiType )
206
223
if err != nil {
@@ -217,14 +234,14 @@ func (blder *Builder) registerConversionWebhook() error {
217
234
return nil
218
235
}
219
236
220
- func (blder * Builder ) getType () (runtime.Object , error ) {
237
+ func (blder * WebhookBuilder ) getType () (runtime.Object , error ) {
221
238
if blder .apiType != nil {
222
239
return blder .apiType , nil
223
240
}
224
241
return nil , errors .New ("For() must be called with a valid object" )
225
242
}
226
243
227
- func (blder * Builder ) isAlreadyHandled (path string ) bool {
244
+ func (blder * WebhookBuilder ) isAlreadyHandled (path string ) bool {
228
245
if blder .mgr .GetWebhookServer ().WebhookMux () == nil {
229
246
return false
230
247
}
0 commit comments