Skip to content

Commit 2b718ac

Browse files
authored
Merge pull request #12 from bakito/main
keep separate variables for validator and mutator in handler
2 parents 5b3ee97 + 8aca827 commit 2b718ac

File tree

5 files changed

+73
-67
lines changed

5 files changed

+73
-67
lines changed

pkg/webhook/handler.go

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,26 @@ type Handler interface {
2020
inject.Client
2121
}
2222

23+
// withValidationHandler create a validation handler instance
24+
func withValidationHandler(validator Validator, object runtime.Object) Handler {
25+
return &handler{validator: validator, injector: validator, Object: object}
26+
}
27+
28+
// withMutationHandler create a mutation handler instance
29+
func withMutationHandler(mutator Mutator, object runtime.Object) Handler {
30+
return &handler{mutator: mutator, injector: mutator, Object: object}
31+
}
32+
2333
// handler is wrapper type for Validator and Mutator, implements the Handler interface.
2434
type handler struct {
25-
Handler interface{}
26-
Object runtime.Object
35+
// injector keep this reference for dependency injection
36+
injector interface{}
37+
// validator instance, should be nil if mutator is set
38+
validator Validator
39+
// mutator instance, should be nil if validator is set
40+
mutator Mutator
41+
42+
Object runtime.Object
2743

2844
decoder *admission.Decoder
2945
}
@@ -59,21 +75,21 @@ func (h *handler) Handle(ctx context.Context, req admission.Request) admission.R
5975
}
6076

6177
// invoke validator
62-
if validator, ok := h.Handler.(Validator); ok {
78+
if h.validator != nil {
6379
switch req.Operation {
6480
case admissionv1.Create:
65-
return validator.ValidateCreate(ctx, req, req.Object.Object)
81+
return h.validator.ValidateCreate(ctx, req, req.Object.Object)
6682
case admissionv1.Update:
67-
return validator.ValidateUpdate(ctx, req, req.Object.Object, req.OldObject.Object)
83+
return h.validator.ValidateUpdate(ctx, req, req.Object.Object, req.OldObject.Object)
6884
case admissionv1.Delete:
69-
return validator.ValidateDelete(ctx, req, req.OldObject.Object)
85+
return h.validator.ValidateDelete(ctx, req, req.OldObject.Object)
7086
}
7187
}
7288

7389
// invoke mutator
74-
if mutator, ok := h.Handler.(Mutator); ok {
90+
if h.mutator != nil {
7591
if req.Object.Object != nil {
76-
resp := mutator.Mutate(ctx, req, req.Object.Object)
92+
resp := h.mutator.Mutate(ctx, req, req.Object.Object)
7793
if resp.Allowed && resp.Patches == nil {
7894
// generate patches
7995
marshalled, err := json.Marshal(req.Object.Object)
@@ -98,7 +114,7 @@ func (h *handler) InjectDecoder(decoder *admission.Decoder) error {
98114
h.decoder = decoder
99115

100116
// pass decoder to the underlying handler
101-
if injector, ok := h.Handler.(admission.DecoderInjector); ok {
117+
if injector, ok := h.injector.(admission.DecoderInjector); ok {
102118
return injector.InjectDecoder(decoder)
103119
}
104120

@@ -108,7 +124,7 @@ func (h *handler) InjectDecoder(decoder *admission.Decoder) error {
108124
// InjectClient implements the inject.Client interface.
109125
func (h *handler) InjectClient(client client.Client) error {
110126
// pass client to the underlying handler
111-
if injector, ok := h.Handler.(inject.Client); ok {
127+
if injector, ok := h.injector.(inject.Client); ok {
112128
return injector.InjectClient(client)
113129
}
114130

pkg/webhook/handler_test.go

Lines changed: 43 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -44,16 +44,13 @@ var _ = Describe("Handler", func() {
4444
raw, err := json.Marshal(pod)
4545
Ω(err).ShouldNot(HaveOccurred())
4646

47-
h := handler{
48-
Handler: &MutateFunc{
49-
Func: func(_ context.Context, _ admission.Request, obj runtime.Object) admission.Response {
50-
pod := obj.(*corev1.Pod)
51-
pod.Name = "bar"
52-
return admission.Allowed("")
53-
},
47+
h := withMutationHandler(&MutateFunc{
48+
Func: func(_ context.Context, _ admission.Request, obj runtime.Object) admission.Response {
49+
pod := obj.(*corev1.Pod)
50+
pod.Name = "bar"
51+
return admission.Allowed("")
5452
},
55-
Object: &corev1.Pod{},
56-
}
53+
}, &corev1.Pod{})
5754
err = h.InjectDecoder(decoder)
5855
Ω(err).ShouldNot(HaveOccurred())
5956
result := h.Handle(context.TODO(), admission.Request{
@@ -79,21 +76,19 @@ var _ = Describe("Handler", func() {
7976
raw, err := json.Marshal(pod)
8077
Ω(err).ShouldNot(HaveOccurred())
8178

82-
h := handler{
83-
Handler: &MutateFunc{
84-
Func: func(_ context.Context, _ admission.Request, obj runtime.Object) admission.Response {
85-
pod := obj.(*corev1.Pod)
86-
pod.Name = "bar"
87-
return admission.Response{
88-
AdmissionResponse: admissionv1.AdmissionResponse{
89-
Allowed: true,
90-
},
91-
Patches: []jsonpatch.JsonPatchOperation{},
92-
}
93-
},
79+
h := withMutationHandler(&MutateFunc{
80+
Func: func(_ context.Context, _ admission.Request, obj runtime.Object) admission.Response {
81+
pod := obj.(*corev1.Pod)
82+
pod.Name = "bar"
83+
return admission.Response{
84+
AdmissionResponse: admissionv1.AdmissionResponse{
85+
Allowed: true,
86+
},
87+
Patches: []jsonpatch.JsonPatchOperation{},
88+
}
9489
},
95-
Object: &corev1.Pod{},
96-
}
90+
}, &corev1.Pod{})
91+
9792
err = h.InjectDecoder(decoder)
9893
Ω(err).ShouldNot(HaveOccurred())
9994
result := h.Handle(context.TODO(), admission.Request{
@@ -117,20 +112,18 @@ var _ = Describe("Handler", func() {
117112
raw, err := json.Marshal(pod)
118113
Ω(err).ShouldNot(HaveOccurred())
119114

120-
h := handler{
121-
Handler: &ValidateFuncs{
122-
CreateFunc: func(_ context.Context, _ admission.Request, _ runtime.Object) admission.Response {
123-
return admission.Allowed("")
124-
},
125-
UpdateFunc: func(_ context.Context, _ admission.Request, _ runtime.Object, _ runtime.Object) admission.Response {
126-
return admission.Denied("")
127-
},
128-
DeleteFunc: func(_ context.Context, _ admission.Request, _ runtime.Object) admission.Response {
129-
return admission.Denied("")
130-
},
115+
h := withValidationHandler(&ValidateFuncs{
116+
CreateFunc: func(_ context.Context, _ admission.Request, _ runtime.Object) admission.Response {
117+
return admission.Allowed("")
131118
},
132-
Object: &corev1.Pod{},
133-
}
119+
UpdateFunc: func(_ context.Context, _ admission.Request, _ runtime.Object, _ runtime.Object) admission.Response {
120+
return admission.Denied("")
121+
},
122+
DeleteFunc: func(_ context.Context, _ admission.Request, _ runtime.Object) admission.Response {
123+
return admission.Denied("")
124+
},
125+
}, &corev1.Pod{})
126+
134127
err = h.InjectDecoder(decoder)
135128
Ω(err).ShouldNot(HaveOccurred())
136129

@@ -176,15 +169,13 @@ var _ = Describe("Handler", func() {
176169
raw, err := json.Marshal(pod)
177170
Ω(err).ShouldNot(HaveOccurred())
178171

179-
h := handler{
180-
Handler: &MutateFunc{
181-
Func: func(_ context.Context, request admission.Request, object runtime.Object) admission.Response {
182-
Ω(object).Should(Equal(pod))
183-
return admission.Allowed("")
184-
},
172+
h := withMutationHandler(&MutateFunc{
173+
Func: func(_ context.Context, request admission.Request, object runtime.Object) admission.Response {
174+
Ω(object).Should(Equal(pod))
175+
return admission.Allowed("")
185176
},
186-
Object: &corev1.Pod{},
187-
}
177+
}, &corev1.Pod{})
178+
188179
err = h.InjectDecoder(decoder)
189180
Ω(err).ShouldNot(HaveOccurred())
190181

@@ -210,14 +201,11 @@ var _ = Describe("Handler", func() {
210201
Ω(result.Allowed).Should(BeTrue())
211202
})
212203
It("should not decode invalid object", func() {
213-
h := handler{
214-
Handler: &MutateFunc{
215-
Func: func(_ context.Context, _ admission.Request, _ runtime.Object) admission.Response {
216-
return admission.Allowed("")
217-
},
204+
h := withMutationHandler(&MutateFunc{
205+
Func: func(_ context.Context, _ admission.Request, _ runtime.Object) admission.Response {
206+
return admission.Allowed("")
218207
},
219-
Object: &corev1.Pod{},
220-
}
208+
}, &corev1.Pod{})
221209
err := h.InjectDecoder(decoder)
222210
Ω(err).ShouldNot(HaveOccurred())
223211

@@ -249,12 +237,12 @@ var _ = Describe("Handler", func() {
249237
})
250238
It("should pass decoder to validating webhook", func() {
251239
webhook := ValidatingWebhook{}
252-
Ω((&handler{Handler: &webhook}).InjectDecoder(decoder)).ShouldNot(HaveOccurred())
240+
Ω((&handler{injector: &webhook}).InjectDecoder(decoder)).ShouldNot(HaveOccurred())
253241
Ω(webhook.Decoder).Should(Equal(decoder))
254242
})
255243
It("should pass decoder to mutating webhook", func() {
256244
webhook := MutatingWebhook{}
257-
Ω((&handler{Handler: &webhook}).InjectDecoder(decoder)).ShouldNot(HaveOccurred())
245+
Ω((&handler{injector: &webhook}).InjectDecoder(decoder)).ShouldNot(HaveOccurred())
258246
Ω(webhook.Decoder).Should(Equal(decoder))
259247
})
260248
It("should never fail if handler not set", func() {
@@ -270,12 +258,12 @@ var _ = Describe("Handler", func() {
270258
})
271259
It("should pass client to validating webhook", func() {
272260
webhook := ValidatingWebhook{}
273-
Ω((&handler{Handler: &webhook}).InjectClient(client)).ShouldNot(HaveOccurred())
261+
Ω((&handler{injector: &webhook}).InjectClient(client)).ShouldNot(HaveOccurred())
274262
Ω(webhook.Client).Should(Equal(client))
275263
})
276264
It("should pass client to mutating webhook", func() {
277265
webhook := MutatingWebhook{}
278-
Ω((&handler{Handler: &webhook}).InjectClient(client)).ShouldNot(HaveOccurred())
266+
Ω((&handler{injector: &webhook}).InjectClient(client)).ShouldNot(HaveOccurred())
279267
Ω(webhook.Client).Should(Equal(client))
280268
})
281269
It("should never fail if handler not set", func() {

pkg/webhook/mutating_webhook.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package webhook
22

33
import (
44
"context"
5+
56
"k8s.io/apimachinery/pkg/runtime"
67
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
78
)

pkg/webhook/mutating_webhook_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package webhook_test
22

33
import (
44
"context"
5+
56
. "github.com/onsi/ginkgo"
67
. "github.com/onsi/gomega"
78
"github.com/snorwin/k8s-generic-webhook/pkg/webhook"

pkg/webhook/webhook.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func (blder *Builder) Complete(i interface{}) error {
8181
}
8282

8383
if validator, ok := i.(Validator); ok {
84-
w, err := blder.createAdmissionWebhook(&handler{Handler: validator, Object: blder.apiType})
84+
w, err := blder.createAdmissionWebhook(withValidationHandler(validator, blder.apiType))
8585
if err != nil {
8686
return err
8787
}
@@ -92,7 +92,7 @@ func (blder *Builder) Complete(i interface{}) error {
9292
}
9393

9494
if mutator, ok := i.(Mutator); ok {
95-
w, err := blder.createAdmissionWebhook(&handler{Handler: mutator, Object: blder.apiType})
95+
w, err := blder.createAdmissionWebhook(withMutationHandler(mutator, blder.apiType))
9696
if err != nil {
9797
return err
9898
}

0 commit comments

Comments
 (0)