Skip to content

Commit d48b844

Browse files
Simplify design and error on multiple mutation mechanisms
1 parent ea977b9 commit d48b844

File tree

3 files changed

+26
-32
lines changed

3 files changed

+26
-32
lines changed

pkg/builder/webhook.go

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import (
3737
// WebhookBuilder builds a Webhook.
3838
type WebhookBuilder struct {
3939
apiType runtime.Object
40-
mutatorFactory admission.HandlerFactory
40+
mutationHandler admission.Handler
4141
customDefaulter admission.CustomDefaulter
4242
customValidator admission.CustomValidator
4343
gvk schema.GroupVersionKind
@@ -66,9 +66,9 @@ func (blder *WebhookBuilder) For(apiType runtime.Object) *WebhookBuilder {
6666
return blder
6767
}
6868

69-
// WithMutatorFactory takes an admission.HandlerFactory, a MutatingWebhook will be wired for the handler that this factory creates.
70-
func (blder *WebhookBuilder) WithMutatorFactory(factory admission.HandlerFactory) *WebhookBuilder {
71-
blder.mutatorFactory = factory
69+
// WithMutationHandler takes an admission.Handler, a MutatingWebhook will be wired for it.
70+
func (blder *WebhookBuilder) WithMutationHandler(h admission.Handler) *WebhookBuilder {
71+
blder.mutationHandler = h
7272
return blder
7373
}
7474

@@ -147,7 +147,9 @@ func (blder *WebhookBuilder) registerWebhooks() error {
147147
}
148148

149149
// Register webhook(s) for type
150-
blder.registerDefaultingWebhook()
150+
if err := blder.registerDefaultingWebhook(); err != nil {
151+
return err
152+
}
151153
blder.registerValidatingWebhook()
152154

153155
err = blder.registerConversionWebhook()
@@ -158,8 +160,11 @@ func (blder *WebhookBuilder) registerWebhooks() error {
158160
}
159161

160162
// registerDefaultingWebhook registers a defaulting webhook if necessary.
161-
func (blder *WebhookBuilder) registerDefaultingWebhook() {
162-
mwh := blder.getDefaultingWebhook()
163+
func (blder *WebhookBuilder) registerDefaultingWebhook() error {
164+
mwh, err := blder.getDefaultingWebhook()
165+
if err != nil {
166+
return err
167+
}
163168
if mwh != nil {
164169
mwh.LogConstructor = blder.logConstructor
165170
path := generateMutatePath(blder.gvk)
@@ -173,21 +178,27 @@ func (blder *WebhookBuilder) registerDefaultingWebhook() {
173178
blder.mgr.GetWebhookServer().Register(path, mwh)
174179
}
175180
}
181+
return nil
176182
}
177183

178-
func (blder *WebhookBuilder) getDefaultingWebhook() *admission.Webhook {
184+
func (blder *WebhookBuilder) getDefaultingWebhook() (*admission.Webhook, error) {
179185
var w *admission.Webhook
180-
if factory := blder.mutatorFactory; factory != nil {
181-
w = admission.WithHandlerFactory(blder.mgr.GetScheme(), blder.apiType, factory)
182-
} else if defaulter := blder.customDefaulter; defaulter != nil {
186+
if handler := blder.mutationHandler; handler != nil {
187+
w = &admission.Webhook{Handler: handler}
188+
}
189+
if defaulter := blder.customDefaulter; defaulter != nil {
190+
if w != nil {
191+
return nil, errors.New("a WebhookBuilder can only define a MutationHandler or a Defaulter, but not both")
192+
}
183193
w = admission.WithCustomDefaulter(blder.mgr.GetScheme(), blder.apiType, defaulter)
184-
} else {
185-
return nil
194+
}
195+
if w == nil {
196+
return nil, nil
186197
}
187198
if blder.recoverPanic != nil {
188199
w = w.WithRecoverPanic(*blder.recoverPanic)
189200
}
190-
return w
201+
return w, nil
191202
}
192203

193204
// registerValidatingWebhook registers a validating webhook if necessary.

pkg/builder/webhook_test.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ func runTests(admissionReviewVersion string) {
229229
ExpectWithOffset(1, err).NotTo(HaveOccurred())
230230

231231
err = WebhookManagedBy(m).
232-
WithMutatorFactory(mutatorFactoryForTestDefaulter(m.GetScheme())).
233232
For(&TestDefaulter{}).
233+
WithMutationHandler(admission.WithCustomDefaulter(m.GetScheme(), &TestDefaulter{}, &TestCustomDefaulter{})).
234234
WithLogConstructor(func(base logr.Logger, req *admission.Request) logr.Logger {
235235
return admission.DefaultLogConstructor(testingLogger, req)
236236
}).
@@ -668,12 +668,6 @@ func (*TestCustomDefaulter) Default(ctx context.Context, obj runtime.Object) err
668668

669669
var _ admission.CustomDefaulter = &TestCustomDefaulter{}
670670

671-
func mutatorFactoryForTestDefaulter(scheme *runtime.Scheme) admission.HandlerFactory {
672-
return func(obj runtime.Object, _ admission.Decoder) admission.Handler {
673-
return admission.WithCustomDefaulter(scheme, obj, &TestCustomDefaulter{}).Handler
674-
}
675-
}
676-
677671
// TestCustomValidator.
678672

679673
type TestCustomValidator struct{}

pkg/webhook/admission/webhook.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
"gomodules.xyz/jsonpatch/v2"
2828
admissionv1 "k8s.io/api/admission/v1"
2929
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
30-
"k8s.io/apimachinery/pkg/runtime"
3130
"k8s.io/apimachinery/pkg/util/json"
3231
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
3332
"k8s.io/klog/v2"
@@ -96,9 +95,6 @@ func (r *Response) Complete(req Request) error {
9695
return nil
9796
}
9897

99-
// HandlerFactory can create a Handler for the given type.
100-
type HandlerFactory func(obj runtime.Object, decoder Decoder) Handler
101-
10298
// Handler can handle an AdmissionRequest.
10399
type Handler interface {
104100
// Handle yields a response to an AdmissionRequest.
@@ -118,13 +114,6 @@ func (f HandlerFunc) Handle(ctx context.Context, req Request) Response {
118114
return f(ctx, req)
119115
}
120116

121-
// WithHandlerFactory creates a new Webhook for a handler factory.
122-
func WithHandlerFactory(scheme *runtime.Scheme, obj runtime.Object, factory HandlerFactory) *Webhook {
123-
return &Webhook{
124-
Handler: factory(obj, NewDecoder(scheme)),
125-
}
126-
}
127-
128117
// Webhook represents each individual webhook.
129118
//
130119
// It must be registered with a webhook.Server or

0 commit comments

Comments
 (0)