@@ -37,11 +37,11 @@ import (
3737)
3838
3939// WebhookBuilder builds a Webhook.
40- type WebhookBuilder struct {
40+ type WebhookBuilder [ T runtime. Object ] struct {
4141apiType runtime.Object
42- customDefaulter admission.CustomDefaulter
42+ customDefaulter admission.Defaulter [ T ]
4343customDefaulterOpts []admission.DefaulterOption
44- customValidator admission.CustomValidator
44+ customValidator admission.Validator [ T ]
4545customPath string
4646customValidatorCustomPath string
4747customDefaulterCustomPath string
@@ -56,16 +56,13 @@ type WebhookBuilder struct {
5656}
5757
5858// WebhookManagedBy returns a new webhook builder.
59- func WebhookManagedBy (m manager.Manager ) * WebhookBuilder {
60- return & WebhookBuilder {mgr : m }
59+ func WebhookManagedBy [ T runtime. Object ] (m manager.Manager ) * WebhookBuilder [ T ] {
60+ return & WebhookBuilder [ T ] {mgr : m }
6161}
6262
63- // TODO(droot): update the GoDoc for conversion.
64-
65- // For takes a runtime.Object which should be a CR.
66- // If the given object implements the admission.Defaulter interface, a MutatingWebhook will be wired for this type.
67- // If the given object implements the admission.Validator interface, a ValidatingWebhook will be wired for this type.
68- func (blder * WebhookBuilder ) For (apiType runtime.Object ) * WebhookBuilder {
63+ // For takes a runtime.Object which should be a CR. It is only required
64+ // if the webhooks generic type is runtime.Object
65+ func (blder * WebhookBuilder [T ]) For (apiType runtime.Object ) * WebhookBuilder [T ] {
6966if blder .apiType != nil {
7067blder .err = errors .New ("For(...) should only be called once, could not assign multiple objects for webhook registration" )
7168}
@@ -75,14 +72,14 @@ func (blder *WebhookBuilder) For(apiType runtime.Object) *WebhookBuilder {
7572
7673// WithDefaulter takes an admission.CustomDefaulter interface, a MutatingWebhook with the provided opts (admission.DefaulterOption)
7774// will be wired for this type.
78- func (blder * WebhookBuilder ) WithDefaulter (defaulter admission.CustomDefaulter , opts ... admission.DefaulterOption ) * WebhookBuilder {
75+ func (blder * WebhookBuilder [ T ] ) WithDefaulter (defaulter admission.Defaulter [ T ] , opts ... admission.DefaulterOption ) * WebhookBuilder [ T ] {
7976blder .customDefaulter = defaulter
8077blder .customDefaulterOpts = opts
8178return blder
8279}
8380
8481// WithValidator takes a admission.CustomValidator interface, a ValidatingWebhook will be wired for this type.
85- func (blder * WebhookBuilder ) WithValidator (validator admission.CustomValidator ) * WebhookBuilder {
82+ func (blder * WebhookBuilder [ T ] ) WithValidator (validator admission.Validator [ T ] ) * WebhookBuilder [ T ] {
8683blder .customValidator = validator
8784return blder
8885}
@@ -95,20 +92,20 @@ func (blder *WebhookBuilder) WithConverter(converterConstructor func(*runtime.Sc
9592}
9693
9794// WithLogConstructor overrides the webhook's LogConstructor.
98- func (blder * WebhookBuilder ) WithLogConstructor (logConstructor func (base logr.Logger , req * admission.Request ) logr.Logger ) * WebhookBuilder {
95+ func (blder * WebhookBuilder [ T ] ) WithLogConstructor (logConstructor func (base logr.Logger , req * admission.Request ) logr.Logger ) * WebhookBuilder [ T ] {
9996blder .logConstructor = logConstructor
10097return blder
10198}
10299
103100// WithContextFunc overrides the webhook's WithContextFunc.
104- func (blder * WebhookBuilder ) WithContextFunc (contextFunc func (context.Context , * http.Request ) context.Context ) * WebhookBuilder {
101+ func (blder * WebhookBuilder [ T ] ) WithContextFunc (contextFunc func (context.Context , * http.Request ) context.Context ) * WebhookBuilder [ T ] {
105102blder .contextFunc = contextFunc
106103return blder
107104}
108105
109106// RecoverPanic indicates whether panics caused by the webhook should be recovered.
110107// Defaults to true.
111- func (blder * WebhookBuilder ) RecoverPanic (recoverPanic bool ) * WebhookBuilder {
108+ func (blder * WebhookBuilder [ T ] ) RecoverPanic (recoverPanic bool ) * WebhookBuilder [ T ] {
112109blder .recoverPanic = & recoverPanic
113110return blder
114111}
@@ -117,25 +114,25 @@ func (blder *WebhookBuilder) RecoverPanic(recoverPanic bool) *WebhookBuilder {
117114//
118115// Deprecated: WithCustomPath should not be used anymore.
119116// Please use WithValidatorCustomPath or WithDefaulterCustomPath instead.
120- func (blder * WebhookBuilder ) WithCustomPath (customPath string ) * WebhookBuilder {
117+ func (blder * WebhookBuilder [ T ] ) WithCustomPath (customPath string ) * WebhookBuilder [ T ] {
121118blder .customPath = customPath
122119return blder
123120}
124121
125122// WithValidatorCustomPath overrides the path of the Validator.
126- func (blder * WebhookBuilder ) WithValidatorCustomPath (customPath string ) * WebhookBuilder {
123+ func (blder * WebhookBuilder [ T ] ) WithValidatorCustomPath (customPath string ) * WebhookBuilder [ T ] {
127124blder .customValidatorCustomPath = customPath
128125return blder
129126}
130127
131128// WithDefaulterCustomPath overrides the path of the Defaulter.
132- func (blder * WebhookBuilder ) WithDefaulterCustomPath (customPath string ) * WebhookBuilder {
129+ func (blder * WebhookBuilder [ T ] ) WithDefaulterCustomPath (customPath string ) * WebhookBuilder [ T ] {
133130blder .customDefaulterCustomPath = customPath
134131return blder
135132}
136133
137134// Complete builds the webhook.
138- func (blder * WebhookBuilder ) Complete () error {
135+ func (blder * WebhookBuilder [ T ] ) Complete () error {
139136// Set the Config
140137blder .loadRestConfig ()
141138
@@ -146,13 +143,13 @@ func (blder *WebhookBuilder) Complete() error {
146143return blder .registerWebhooks ()
147144}
148145
149- func (blder * WebhookBuilder ) loadRestConfig () {
146+ func (blder * WebhookBuilder [ T ] ) loadRestConfig () {
150147if blder .config == nil {
151148blder .config = blder .mgr .GetConfig ()
152149}
153150}
154151
155- func (blder * WebhookBuilder ) setLogConstructor () {
152+ func (blder * WebhookBuilder [ T ] ) setLogConstructor () {
156153if blder .logConstructor == nil {
157154blder .logConstructor = func (base logr.Logger , req * admission.Request ) logr.Logger {
158155log := base .WithValues (
@@ -172,11 +169,11 @@ func (blder *WebhookBuilder) setLogConstructor() {
172169}
173170}
174171
175- func (blder * WebhookBuilder ) isThereCustomPathConflict () bool {
172+ func (blder * WebhookBuilder [ T ] ) isThereCustomPathConflict () bool {
176173return (blder .customPath != "" && blder .customDefaulter != nil && blder .customValidator != nil ) || (blder .customPath != "" && blder .customDefaulterCustomPath != "" ) || (blder .customPath != "" && blder .customValidatorCustomPath != "" )
177174}
178175
179- func (blder * WebhookBuilder ) registerWebhooks () error {
176+ func (blder * WebhookBuilder [ T ] ) registerWebhooks () error {
180177typ , err := blder .getType ()
181178if err != nil {
182179return err
@@ -217,7 +214,7 @@ func (blder *WebhookBuilder) registerWebhooks() error {
217214}
218215
219216// registerDefaultingWebhook registers a defaulting webhook if necessary.
220- func (blder * WebhookBuilder ) registerDefaultingWebhook () error {
217+ func (blder * WebhookBuilder [ T ] ) registerDefaultingWebhook () error {
221218mwh := blder .getDefaultingWebhook ()
222219if mwh != nil {
223220mwh .LogConstructor = blder .logConstructor
@@ -244,9 +241,15 @@ func (blder *WebhookBuilder) registerDefaultingWebhook() error {
244241return nil
245242}
246243
247- func (blder * WebhookBuilder ) getDefaultingWebhook () * admission.Webhook {
244+ func (blder * WebhookBuilder [ T ] ) getDefaultingWebhook () * admission.Webhook {
248245if defaulter := blder .customDefaulter ; defaulter != nil {
249- w := admission .WithCustomDefaulter (blder .mgr .GetScheme (), blder .apiType , defaulter , blder .customDefaulterOpts ... )
246+ var w * admission.Webhook
247+ switch any (* new (T )).(type ) {
248+ case runtime.Object :
249+ w = admission .WithCustomDefaulter (blder .mgr .GetScheme (), blder .apiType , & defaulterWrapper [T ]{defaulter : defaulter }, blder .customDefaulterOpts ... )
250+ default :
251+ w = admission .WithDefaulter (blder .mgr .GetScheme (), defaulter , blder .customDefaulterOpts ... )
252+ }
250253if blder .recoverPanic != nil {
251254w = w .WithRecoverPanic (* blder .recoverPanic )
252255}
@@ -255,8 +258,16 @@ func (blder *WebhookBuilder) getDefaultingWebhook() *admission.Webhook {
255258return nil
256259}
257260
261+ type defaulterWrapper [T runtime.Object ] struct {
262+ defaulter admission.Defaulter [T ]
263+ }
264+
265+ func (d * defaulterWrapper [T ]) Default (ctx context.Context , obj runtime.Object ) error {
266+ return d .defaulter .Default (ctx , obj .(T ))
267+ }
268+
258269// registerValidatingWebhook registers a validating webhook if necessary.
259- func (blder * WebhookBuilder ) registerValidatingWebhook () error {
270+ func (blder * WebhookBuilder [ T ] ) registerValidatingWebhook () error {
260271vwh := blder .getValidatingWebhook ()
261272if vwh != nil {
262273vwh .LogConstructor = blder .logConstructor
@@ -283,9 +294,15 @@ func (blder *WebhookBuilder) registerValidatingWebhook() error {
283294return nil
284295}
285296
286- func (blder * WebhookBuilder ) getValidatingWebhook () * admission.Webhook {
297+ func (blder * WebhookBuilder [ T ] ) getValidatingWebhook () * admission.Webhook {
287298if validator := blder .customValidator ; validator != nil {
288- w := admission .WithCustomValidator (blder .mgr .GetScheme (), blder .apiType , validator )
299+ var w * admission.Webhook
300+ switch any (* new (T )).(type ) {
301+ case runtime.Object :
302+ w = admission .WithCustomValidator (blder .mgr .GetScheme (), blder .apiType , & validatorWrapper [T ]{validator : validator })
303+ default :
304+ w = admission .WithValidator (blder .mgr .GetScheme (), validator )
305+ }
289306if blder .recoverPanic != nil {
290307w = w .WithRecoverPanic (* blder .recoverPanic )
291308}
@@ -294,7 +311,7 @@ func (blder *WebhookBuilder) getValidatingWebhook() *admission.Webhook {
294311return nil
295312}
296313
297- func (blder * WebhookBuilder ) registerConversionWebhook () error {
314+ func (blder * WebhookBuilder [ T ] ) registerConversionWebhook () error {
298315if blder .converterConstructor != nil {
299316converter , err := blder .converterConstructor (blder .mgr .GetScheme ())
300317if err != nil {
@@ -323,14 +340,14 @@ func (blder *WebhookBuilder) registerConversionWebhook() error {
323340return nil
324341}
325342
326- func (blder * WebhookBuilder ) getType () (runtime.Object , error ) {
343+ func (blder * WebhookBuilder [ T ] ) getType () (runtime.Object , error ) {
327344if blder .apiType != nil {
328345return blder .apiType , nil
329346}
330347return nil , errors .New ("For() must be called with a valid object" )
331348}
332349
333- func (blder * WebhookBuilder ) isAlreadyHandled (path string ) bool {
350+ func (blder * WebhookBuilder [ T ] ) isAlreadyHandled (path string ) bool {
334351if blder .mgr .GetWebhookServer ().WebhookMux () == nil {
335352return false
336353}
0 commit comments