@@ -28,6 +28,18 @@ import (
2828 "k8s.io/apimachinery/pkg/runtime"
2929)
3030
31+ // ObjectHandler defines functions for handling objects on webhooks.
32+ type ObjectHandler interface {
33+ Handle (ctx context.Context , raw []byte , obj runtime.Object ) Response
34+ }
35+
36+ // WithObjectHandler creates a new Webhook for an ObjectHandler interface.
37+ func WithObjectHandler (scheme * runtime.Scheme , obj runtime.Object , handler ObjectHandler ) * Webhook {
38+ return & Webhook {
39+ Handler : & handlerForType {object : obj , handler : handler , decoder : NewDecoder (scheme )},
40+ }
41+ }
42+
3143// CustomDefaulter defines functions for setting defaults on resources.
3244type CustomDefaulter interface {
3345 Default (ctx context.Context , obj runtime.Object ) error
@@ -36,22 +48,22 @@ type CustomDefaulter interface {
3648// WithCustomDefaulter creates a new Webhook for a CustomDefaulter interface.
3749func WithCustomDefaulter (scheme * runtime.Scheme , obj runtime.Object , defaulter CustomDefaulter ) * Webhook {
3850 return & Webhook {
39- Handler : & defaulterForType {object : obj , defaulter : defaulter , decoder : NewDecoder (scheme )},
51+ Handler : & handlerForType {object : obj , handler : & handlerForDefaulter { defaulter : defaulter } , decoder : NewDecoder (scheme )},
4052 }
4153}
4254
43- type defaulterForType struct {
44- defaulter CustomDefaulter
45- object runtime.Object
46- decoder Decoder
55+ type handlerForType struct {
56+ handler ObjectHandler
57+ object runtime.Object
58+ decoder Decoder
4759}
4860
4961// Handle handles admission requests.
50- func (h * defaulterForType ) Handle (ctx context.Context , req Request ) Response {
62+ func (h * handlerForType ) Handle (ctx context.Context , req Request ) Response {
5163 if h .decoder == nil {
5264 panic ("decoder should never be nil" )
5365 }
54- if h .defaulter == nil {
66+ if h .handler == nil {
5567 panic ("defaulter should never be nil" )
5668 }
5769 if h .object == nil {
@@ -76,7 +88,14 @@ func (h *defaulterForType) Handle(ctx context.Context, req Request) Response {
7688 return Errored (http .StatusBadRequest , err )
7789 }
7890
79- // Default the object
91+ return h .handler .Handle (ctx , req .Object .Raw , obj )
92+ }
93+
94+ type handlerForDefaulter struct {
95+ defaulter CustomDefaulter
96+ }
97+
98+ func (h * handlerForDefaulter ) Handle (ctx context.Context , raw []byte , obj runtime.Object ) Response {
8099 if err := h .defaulter .Default (ctx , obj ); err != nil {
81100 var apiStatus apierrors.APIStatus
82101 if errors .As (err , & apiStatus ) {
@@ -90,5 +109,5 @@ func (h *defaulterForType) Handle(ctx context.Context, req Request) Response {
90109 if err != nil {
91110 return Errored (http .StatusInternalServerError , err )
92111 }
93- return PatchResponseFromRaw (req . Object . Raw , marshalled )
112+ return PatchResponseFromRaw (raw , marshalled )
94113}
0 commit comments