@@ -17,6 +17,7 @@ limitations under the License.
17
17
package builder
18
18
19
19
import (
20
+ "errors"
20
21
"net/http"
21
22
"net/url"
22
23
"strings"
@@ -32,10 +33,12 @@ import (
32
33
33
34
// WebhookBuilder builds a Webhook.
34
35
type WebhookBuilder struct {
35
- apiType runtime.Object
36
- gvk schema.GroupVersionKind
37
- mgr manager.Manager
38
- config * rest.Config
36
+ apiType runtime.Object
37
+ withDefaulter admission.WithDefaulter
38
+ withValidator admission.WithValidator
39
+ gvk schema.GroupVersionKind
40
+ mgr manager.Manager
41
+ config * rest.Config
39
42
}
40
43
41
44
// WebhookManagedBy allows inform its manager.Manager.
@@ -53,6 +56,18 @@ func (blder *WebhookBuilder) For(apiType runtime.Object) *WebhookBuilder {
53
56
return blder
54
57
}
55
58
59
+ // WithDefaulter takes a admission.WithDefaulter interface, a MutatingWebhook will be wired for this type.
60
+ func (blder * WebhookBuilder ) WithDefaulter (defaulter admission.WithDefaulter ) * WebhookBuilder {
61
+ blder .withDefaulter = defaulter
62
+ return blder
63
+ }
64
+
65
+ // WithValidator takes a admission.WithValidator interface, a ValidatingWebhook will be wired for this type.
66
+ func (blder * WebhookBuilder ) WithValidator (validator admission.WithValidator ) * WebhookBuilder {
67
+ blder .withValidator = validator
68
+ return blder
69
+ }
70
+
56
71
// Complete builds the webhook.
57
72
func (blder * WebhookBuilder ) Complete () error {
58
73
// Set the Config
@@ -69,9 +84,13 @@ func (blder *WebhookBuilder) loadRestConfig() {
69
84
}
70
85
71
86
func (blder * WebhookBuilder ) registerWebhooks () error {
87
+ typ , err := blder .getType ()
88
+ if err != nil {
89
+ return err
90
+ }
91
+
72
92
// Create webhook(s) for each type
73
- var err error
74
- blder .gvk , err = apiutil .GVKForObject (blder .apiType , blder .mgr .GetScheme ())
93
+ blder .gvk , err = apiutil .GVKForObject (typ , blder .mgr .GetScheme ())
75
94
if err != nil {
76
95
return err
77
96
}
@@ -88,12 +107,7 @@ func (blder *WebhookBuilder) registerWebhooks() error {
88
107
89
108
// registerDefaultingWebhook registers a defaulting webhook if th.
90
109
func (blder * WebhookBuilder ) registerDefaultingWebhook () {
91
- defaulter , isDefaulter := blder .apiType .(admission.Defaulter )
92
- if ! isDefaulter {
93
- log .Info ("skip registering a mutating webhook, admission.Defaulter interface is not implemented" , "GVK" , blder .gvk )
94
- return
95
- }
96
- mwh := admission .DefaultingWebhookFor (defaulter )
110
+ mwh := blder .getDefaultingWebhook ()
97
111
if mwh != nil {
98
112
path := generateMutatePath (blder .gvk )
99
113
@@ -108,13 +122,21 @@ func (blder *WebhookBuilder) registerDefaultingWebhook() {
108
122
}
109
123
}
110
124
111
- func (blder * WebhookBuilder ) registerValidatingWebhook () {
112
- validator , isValidator := blder .apiType .(admission.Validator )
113
- if ! isValidator {
114
- log .Info ("skip registering a validating webhook, admission.Validator interface is not implemented" , "GVK" , blder .gvk )
115
- return
125
+ func (blder * WebhookBuilder ) getDefaultingWebhook () * admission.Webhook {
126
+ if defaulter := blder .withDefaulter ; defaulter != nil {
127
+ return admission .WithCustomDefaulter (blder .apiType , defaulter )
128
+ }
129
+ if defaulter , ok := blder .apiType .(admission.Defaulter ); ok {
130
+ return admission .DefaultingWebhookFor (defaulter )
116
131
}
117
- vwh := admission .ValidatingWebhookFor (validator )
132
+ log .Info (
133
+ "skip registering a mutating webhook, admission.Defaulter or admission.DefaulterFor interface is not implemented" ,
134
+ "GVK" , blder .gvk )
135
+ return nil
136
+ }
137
+
138
+ func (blder * WebhookBuilder ) registerValidatingWebhook () {
139
+ vwh := blder .getValidatingWebhook ()
118
140
if vwh != nil {
119
141
path := generateValidatePath (blder .gvk )
120
142
@@ -129,6 +151,19 @@ func (blder *WebhookBuilder) registerValidatingWebhook() {
129
151
}
130
152
}
131
153
154
+ func (blder * WebhookBuilder ) getValidatingWebhook () * admission.Webhook {
155
+ if validator := blder .withValidator ; validator != nil {
156
+ return admission .WithCustomValidator (blder .apiType , validator )
157
+ }
158
+ if validator , ok := blder .apiType .(admission.Validator ); ok {
159
+ return admission .ValidatingWebhookFor (validator )
160
+ }
161
+ log .Info (
162
+ "skip registering a validating webhook, admission.Validator or admission.ValidatorFor interface is not implemented" ,
163
+ "GVK" , blder .gvk )
164
+ return nil
165
+ }
166
+
132
167
func (blder * WebhookBuilder ) registerConversionWebhook () error {
133
168
ok , err := conversion .IsConvertible (blder .mgr .GetScheme (), blder .apiType )
134
169
if err != nil {
@@ -145,6 +180,13 @@ func (blder *WebhookBuilder) registerConversionWebhook() error {
145
180
return nil
146
181
}
147
182
183
+ func (blder * WebhookBuilder ) getType () (runtime.Object , error ) {
184
+ if blder .apiType != nil {
185
+ return blder .apiType , nil
186
+ }
187
+ return nil , errors .New ("one of For() or HandlerFor() should be called" )
188
+ }
189
+
148
190
func (blder * WebhookBuilder ) isAlreadyHandled (path string ) bool {
149
191
if blder .mgr .GetWebhookServer ().WebhookMux == nil {
150
192
return false
0 commit comments