Skip to content

Commit 2af7489

Browse files
committed
Remove controller-runtime's dependecy injections
1 parent b83b18f commit 2af7489

File tree

5 files changed

+47
-164
lines changed

5 files changed

+47
-164
lines changed

pkg/mocks/manager/mock.go

Lines changed: 19 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/webhook/handler.go

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,33 +7,22 @@ import (
77

88
admissionv1 "k8s.io/api/admission/v1"
99
"k8s.io/apimachinery/pkg/runtime"
10-
"sigs.k8s.io/controller-runtime/pkg/client"
1110
"sigs.k8s.io/controller-runtime/pkg/log"
12-
"sigs.k8s.io/controller-runtime/pkg/runtime/inject"
1311
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
1412
)
1513

16-
// Handler is an interface that combines various interfaces.
17-
type Handler interface {
18-
admission.Handler
19-
admission.DecoderInjector
20-
inject.Client
21-
}
22-
2314
// withValidationHandler create a validation handler instance
24-
func withValidationHandler(validator Validator, object runtime.Object) Handler {
25-
return &handler{validator: validator, injector: validator, Object: object}
15+
func withValidationHandler(validator Validator, object runtime.Object, decoder *admission.Decoder) admission.Handler {
16+
return &handler{validator: validator, Object: object, decoder: decoder}
2617
}
2718

2819
// withMutationHandler create a mutation handler instance
29-
func withMutationHandler(mutator Mutator, object runtime.Object) Handler {
30-
return &handler{mutator: mutator, injector: mutator, Object: object}
20+
func withMutationHandler(mutator Mutator, object runtime.Object, decoder *admission.Decoder) admission.Handler {
21+
return &handler{mutator: mutator, Object: object, decoder: decoder}
3122
}
3223

3324
// handler is wrapper type for Validator and Mutator, implements the Handler interface.
3425
type handler struct {
35-
// injector keep this reference for dependency injection
36-
injector interface{}
3726
// validator instance, should be nil if mutator is set
3827
validator Validator
3928
// mutator instance, should be nil if validator is set
@@ -108,25 +97,3 @@ func (h *handler) Handle(ctx context.Context, req admission.Request) admission.R
10897

10998
return admission.Denied("")
11099
}
111-
112-
// InjectDecoder implements the admission.DecoderInjector interface.
113-
func (h *handler) InjectDecoder(decoder *admission.Decoder) error {
114-
h.decoder = decoder
115-
116-
// pass decoder to the underlying handler
117-
if injector, ok := h.injector.(admission.DecoderInjector); ok {
118-
return injector.InjectDecoder(decoder)
119-
}
120-
121-
return nil
122-
}
123-
124-
// InjectClient implements the inject.Client interface.
125-
func (h *handler) InjectClient(client client.Client) error {
126-
// pass client to the underlying handler
127-
if injector, ok := h.injector.(inject.Client); ok {
128-
return injector.InjectClient(client)
129-
}
130-
131-
return nil
132-
}

pkg/webhook/handler_test.go

Lines changed: 6 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ import (
1212
corev1 "k8s.io/api/core/v1"
1313
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1414
"k8s.io/apimachinery/pkg/runtime"
15-
"sigs.k8s.io/controller-runtime/pkg/client"
16-
"sigs.k8s.io/controller-runtime/pkg/client/fake"
1715
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
1816
)
1917

@@ -26,7 +24,7 @@ var _ = Describe("Handler", func() {
2624
scheme := runtime.NewScheme()
2725
err := corev1.AddToScheme(scheme)
2826
Ω(err).ShouldNot(HaveOccurred())
29-
decoder, err = admission.NewDecoder(scheme)
27+
decoder = admission.NewDecoder(scheme)
3028
Ω(err).ShouldNot(HaveOccurred())
3129

3230
})
@@ -50,9 +48,7 @@ var _ = Describe("Handler", func() {
5048
pod.Name = "bar"
5149
return admission.Allowed("")
5250
},
53-
}, &corev1.Pod{})
54-
err = h.InjectDecoder(decoder)
55-
Ω(err).ShouldNot(HaveOccurred())
51+
}, &corev1.Pod{}, decoder)
5652
result := h.Handle(context.TODO(), admission.Request{
5753
AdmissionRequest: admissionv1.AdmissionRequest{
5854
Object: runtime.RawExtension{
@@ -87,10 +83,7 @@ var _ = Describe("Handler", func() {
8783
Patches: []jsonpatch.JsonPatchOperation{},
8884
}
8985
},
90-
}, &corev1.Pod{})
91-
92-
err = h.InjectDecoder(decoder)
93-
Ω(err).ShouldNot(HaveOccurred())
86+
}, &corev1.Pod{}, decoder)
9487
result := h.Handle(context.TODO(), admission.Request{
9588
AdmissionRequest: admissionv1.AdmissionRequest{
9689
Object: runtime.RawExtension{
@@ -122,10 +115,7 @@ var _ = Describe("Handler", func() {
122115
DeleteFunc: func(_ context.Context, _ admission.Request, _ runtime.Object) admission.Response {
123116
return admission.Denied("")
124117
},
125-
}, &corev1.Pod{})
126-
127-
err = h.InjectDecoder(decoder)
128-
Ω(err).ShouldNot(HaveOccurred())
118+
}, &corev1.Pod{}, decoder)
129119

130120
result := h.Handle(context.TODO(), admission.Request{
131121
AdmissionRequest: admissionv1.AdmissionRequest{
@@ -174,10 +164,7 @@ var _ = Describe("Handler", func() {
174164
Ω(object).Should(Equal(pod))
175165
return admission.Allowed("")
176166
},
177-
}, &corev1.Pod{})
178-
179-
err = h.InjectDecoder(decoder)
180-
Ω(err).ShouldNot(HaveOccurred())
167+
}, &corev1.Pod{}, decoder)
181168

182169
result := h.Handle(context.TODO(), admission.Request{
183170
AdmissionRequest: admissionv1.AdmissionRequest{
@@ -205,9 +192,7 @@ var _ = Describe("Handler", func() {
205192
Func: func(_ context.Context, _ admission.Request, _ runtime.Object) admission.Response {
206193
return admission.Allowed("")
207194
},
208-
}, &corev1.Pod{})
209-
err := h.InjectDecoder(decoder)
210-
Ω(err).ShouldNot(HaveOccurred())
195+
}, &corev1.Pod{}, decoder)
211196

212197
result := h.Handle(context.TODO(), admission.Request{
213198
AdmissionRequest: admissionv1.AdmissionRequest{
@@ -228,46 +213,4 @@ var _ = Describe("Handler", func() {
228213
Ω(result.Allowed).Should(BeFalse())
229214
})
230215
})
231-
Context("InjectDecoder", func() {
232-
var (
233-
decoder *admission.Decoder
234-
)
235-
BeforeEach(func() {
236-
decoder = &admission.Decoder{}
237-
})
238-
It("should pass decoder to validating webhook", func() {
239-
webhook := ValidatingWebhook{}
240-
Ω((&handler{injector: &webhook}).InjectDecoder(decoder)).ShouldNot(HaveOccurred())
241-
Ω(webhook.Decoder).Should(Equal(decoder))
242-
})
243-
It("should pass decoder to mutating webhook", func() {
244-
webhook := MutatingWebhook{}
245-
Ω((&handler{injector: &webhook}).InjectDecoder(decoder)).ShouldNot(HaveOccurred())
246-
Ω(webhook.Decoder).Should(Equal(decoder))
247-
})
248-
It("should never fail if handler not set", func() {
249-
Ω((&handler{}).InjectDecoder(decoder)).ShouldNot(HaveOccurred())
250-
})
251-
})
252-
Context("InjectClient", func() {
253-
var (
254-
client client.Client
255-
)
256-
BeforeEach(func() {
257-
client = fake.NewClientBuilder().Build()
258-
})
259-
It("should pass client to validating webhook", func() {
260-
webhook := ValidatingWebhook{}
261-
Ω((&handler{injector: &webhook}).InjectClient(client)).ShouldNot(HaveOccurred())
262-
Ω(webhook.Client).Should(Equal(client))
263-
})
264-
It("should pass client to mutating webhook", func() {
265-
webhook := MutatingWebhook{}
266-
Ω((&handler{injector: &webhook}).InjectClient(client)).ShouldNot(HaveOccurred())
267-
Ω(webhook.Client).Should(Equal(client))
268-
})
269-
It("should never fail if handler not set", func() {
270-
Ω((&handler{}).InjectClient(client)).ShouldNot(HaveOccurred())
271-
})
272-
})
273216
})

pkg/webhook/webhook.go

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
ctrl "sigs.k8s.io/controller-runtime"
1212
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
1313
"sigs.k8s.io/controller-runtime/pkg/manager"
14-
"sigs.k8s.io/controller-runtime/pkg/runtime/inject"
1514
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
1615
)
1716

@@ -80,11 +79,12 @@ func (blder *Builder) Complete(i interface{}) error {
8079
return fmt.Errorf("validating prefix %q must start with '/'", blder.prefixValidate)
8180
}
8281

82+
decoder := admission.NewDecoder(blder.mgr.GetScheme())
83+
8384
isWebhook := false
8485
if validator, ok := i.(Validator); ok {
85-
w, err := blder.createAdmissionWebhook(withValidationHandler(validator, blder.apiType))
86-
if err != nil {
87-
return err
86+
w := &admission.Webhook{
87+
Handler: withValidationHandler(validator, blder.apiType, decoder),
8888
}
8989

9090
if err := blder.registerValidatingWebhook(w); err != nil {
@@ -94,9 +94,8 @@ func (blder *Builder) Complete(i interface{}) error {
9494
}
9595

9696
if mutator, ok := i.(Mutator); ok {
97-
w, err := blder.createAdmissionWebhook(withMutationHandler(mutator, blder.apiType))
98-
if err != nil {
99-
return err
97+
w := &admission.Webhook{
98+
Handler: withMutationHandler(mutator, blder.apiType, decoder),
10099
}
101100

102101
if err := blder.registerMutatingWebhook(w); err != nil {
@@ -109,31 +108,19 @@ func (blder *Builder) Complete(i interface{}) error {
109108
return fmt.Errorf("webhook instance %v does implement neither Mutator nor Validator interface", i)
110109
}
111110

112-
return nil
113-
}
114-
115-
func (blder *Builder) createAdmissionWebhook(handler Handler) (*admission.Webhook, error) {
116-
w := &admission.Webhook{
117-
Handler: handler,
118-
}
119-
120-
// inject scheme for decoder
121-
if err := w.InjectScheme(blder.mgr.GetScheme()); err != nil {
122-
return nil, err
111+
if injector, ok := i.(InjectedClient); ok {
112+
if err := injector.InjectClient(blder.mgr.GetClient()); err != nil {
113+
return err
114+
}
123115
}
124116

125-
// inject client
126-
if err := w.InjectFunc(func(i interface{}) error {
127-
if injector, ok := i.(inject.Client); ok {
128-
return injector.InjectClient(blder.mgr.GetClient())
117+
if injector, ok := i.(InjectedDecoder); ok {
118+
if err := injector.InjectDecoder(decoder); err != nil {
119+
return err
129120
}
130-
131-
return nil
132-
}); err != nil {
133-
return nil, err
134121
}
135122

136-
return w, nil
123+
return nil
137124
}
138125

139126
func (blder *Builder) registerValidatingWebhook(w *admission.Webhook) error {
@@ -171,11 +158,11 @@ func (blder *Builder) registerMutatingWebhook(w *admission.Webhook) error {
171158
}
172159

173160
func isAlreadyHandled(mgr ctrl.Manager, path string) bool {
174-
if mgr.GetWebhookServer().WebhookMux == nil {
161+
if mgr.GetWebhookServer().WebhookMux() == nil {
175162
return false
176163
}
177164

178-
h, p := mgr.GetWebhookServer().WebhookMux.Handler(&http.Request{URL: &url.URL{Path: path}})
165+
h, p := mgr.GetWebhookServer().WebhookMux().Handler(&http.Request{URL: &url.URL{Path: path}})
179166
if p == path && h != nil {
180167
return true
181168
}

pkg/webhook/webhook_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var _ = Describe("Webhook", func() {
2121
mock *gomock.Controller
2222
mgr *manager.MockManager
2323

24-
server *webhook2.Server
24+
server webhook2.Server
2525
)
2626
BeforeEach(func() {
2727
mock = gomock.NewController(GinkgoT())
@@ -40,7 +40,7 @@ var _ = Describe("Webhook", func() {
4040
Return(fake.NewClientBuilder().Build()).
4141
AnyTimes()
4242

43-
server = &webhook2.Server{}
43+
server = &webhook2.DefaultServer{}
4444
mgr.EXPECT().
4545
GetWebhookServer().
4646
Return(server).AnyTimes()

0 commit comments

Comments
 (0)