Skip to content

Commit de03011

Browse files
Resync webhook builder
Change-Id: I4de1ebbe75a9220466c50381d0e708a1b6d23c8f
1 parent 9430ed4 commit de03011

File tree

9 files changed

+64
-47
lines changed

9 files changed

+64
-47
lines changed

pkg/controller/jobframework/base_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func DefaultWebhookFactory(job GenericJob, fromObject func(runtime.Object) Gener
4141
ManageJobsWithoutQueueName: options.ManageJobsWithoutQueueName,
4242
FromObject: fromObject,
4343
}
44-
return webhook.ManagedBy(mgr).
44+
return webhook.WebhookManagedBy(mgr).
4545
For(job.Object()).
4646
WithMutationHandler(webhook.WithDefaulter(mgr.GetScheme(), job.Object(), wh)).
4747
WithValidator(wh).

pkg/controller/jobframework/webhook/builder.go

Lines changed: 55 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -34,58 +34,69 @@ import (
3434
"sigs.k8s.io/controller-runtime/pkg/webhook/conversion"
3535
)
3636

37-
// This code is copied from https://github.com/kubernetes-sigs/controller-runtime
38-
// with some modifications to get full control of the construction of patches.
37+
// This code is copied from https://github.com/kubernetes-sigs/controller-runtime/blob/896f6ded750155f9ecfdf4d8e10a26fc3fb78384/pkg/builder/webhook.go
38+
// with one modification to get full control of the construction of patches:
39+
// replacing CustomDefaulter with an admission.Handler.
40+
// TODO(#3137): remove this file
3941

40-
// Builder builds a Webhook.
41-
type Builder struct {
42+
// WebhookBuilder builds a Webhook.
43+
type WebhookBuilder struct {
4244
apiType runtime.Object
4345
mutationHandler admission.Handler
4446
customValidator admission.CustomValidator
4547
gvk schema.GroupVersionKind
4648
mgr manager.Manager
4749
config *rest.Config
48-
recoverPanic bool
50+
recoverPanic *bool
4951
logConstructor func(base logr.Logger, req *admission.Request) logr.Logger
52+
err error
5053
}
5154

52-
// ManagedBy returns a new webhook builder.
53-
func ManagedBy(m manager.Manager) *Builder {
54-
return &Builder{mgr: m}
55+
// WebhookManagedBy returns a new webhook builder.
56+
func WebhookManagedBy(m manager.Manager) *WebhookBuilder {
57+
return &WebhookBuilder{mgr: m}
5558
}
5659

60+
// TODO(droot): update the GoDoc for conversion.
61+
5762
// For takes a runtime.Object which should be a CR.
58-
func (blder *Builder) For(apiType runtime.Object) *Builder {
63+
// If the given object implements the admission.Defaulter interface, a MutatingWebhook will be wired for this type.
64+
// If the given object implements the admission.Validator interface, a ValidatingWebhook will be wired for this type.
65+
func (blder *WebhookBuilder) For(apiType runtime.Object) *WebhookBuilder {
66+
if blder.apiType != nil {
67+
blder.err = errors.New("For(...) should only be called once, could not assign multiple objects for webhook registration")
68+
}
5969
blder.apiType = apiType
6070
return blder
6171
}
6272

63-
// WithMutationHandler takes an admission.Handler inteface, a MutationgWebhook will be wired for this type.
64-
func (blder *Builder) WithMutationHandler(handler admission.Handler) *Builder {
65-
blder.mutationHandler = handler
73+
// WithDefaulter takes an admission.CustomDefaulter interface, a MutatingWebhook will be wired for this type.
74+
func (blder *WebhookBuilder) WithMutationHandler(h admission.Handler) *WebhookBuilder {
75+
blder.mutationHandler = h
6676
return blder
6777
}
6878

6979
// WithValidator takes a admission.CustomValidator interface, a ValidatingWebhook will be wired for this type.
70-
func (blder *Builder) WithValidator(validator admission.CustomValidator) *Builder {
80+
func (blder *WebhookBuilder) WithValidator(validator admission.CustomValidator) *WebhookBuilder {
7181
blder.customValidator = validator
7282
return blder
7383
}
7484

7585
// WithLogConstructor overrides the webhook's LogConstructor.
76-
func (blder *Builder) WithLogConstructor(logConstructor func(base logr.Logger, req *admission.Request) logr.Logger) *Builder {
86+
func (blder *WebhookBuilder) WithLogConstructor(logConstructor func(base logr.Logger, req *admission.Request) logr.Logger) *WebhookBuilder {
7787
blder.logConstructor = logConstructor
7888
return blder
7989
}
8090

8191
// RecoverPanic indicates whether panics caused by the webhook should be recovered.
82-
func (blder *Builder) RecoverPanic() *Builder {
83-
blder.recoverPanic = true
92+
// Defaults to true.
93+
func (blder *WebhookBuilder) RecoverPanic(recoverPanic bool) *WebhookBuilder {
94+
blder.recoverPanic = &recoverPanic
8495
return blder
8596
}
8697

8798
// Complete builds the webhook.
88-
func (blder *Builder) Complete() error {
99+
func (blder *WebhookBuilder) Complete() error {
89100
// Set the Config
90101
blder.loadRestConfig()
91102

@@ -96,13 +107,13 @@ func (blder *Builder) Complete() error {
96107
return blder.registerWebhooks()
97108
}
98109

99-
func (blder *Builder) loadRestConfig() {
110+
func (blder *WebhookBuilder) loadRestConfig() {
100111
if blder.config == nil {
101112
blder.config = blder.mgr.GetConfig()
102113
}
103114
}
104115

105-
func (blder *Builder) setLogConstructor() {
116+
func (blder *WebhookBuilder) setLogConstructor() {
106117
if blder.logConstructor == nil {
107118
blder.logConstructor = func(base logr.Logger, req *admission.Request) logr.Logger {
108119
log := base.WithValues(
@@ -122,7 +133,7 @@ func (blder *Builder) setLogConstructor() {
122133
}
123134
}
124135

125-
func (blder *Builder) registerWebhooks() error {
136+
func (blder *WebhookBuilder) registerWebhooks() error {
126137
typ, err := blder.getType()
127138
if err != nil {
128139
return err
@@ -141,11 +152,11 @@ func (blder *Builder) registerWebhooks() error {
141152
if err != nil {
142153
return err
143154
}
144-
return nil
155+
return blder.err
145156
}
146157

147158
// registerDefaultingWebhook registers a defaulting webhook if necessary.
148-
func (blder *Builder) registerDefaultingWebhook() {
159+
func (blder *WebhookBuilder) registerDefaultingWebhook() {
149160
mwh := blder.getDefaultingWebhook()
150161
if mwh != nil {
151162
mwh.LogConstructor = blder.logConstructor
@@ -154,26 +165,30 @@ func (blder *Builder) registerDefaultingWebhook() {
154165
// Checking if the path is already registered.
155166
// If so, just skip it.
156167
if !blder.isAlreadyHandled(path) {
157-
blder.mgr.GetLogger().Info("Registering a mutating webhook",
168+
log := blder.mgr.GetLogger()
169+
log.Info("Registering a mutating webhook",
158170
"GVK", blder.gvk,
159171
"path", path)
160172
blder.mgr.GetWebhookServer().Register(path, mwh)
161173
}
162174
}
163175
}
164176

165-
func (blder *Builder) getDefaultingWebhook() *admission.Webhook {
177+
func (blder *WebhookBuilder) getDefaultingWebhook() *admission.Webhook {
166178
if handler := blder.mutationHandler; handler != nil {
167-
return (&admission.Webhook{Handler: handler}).WithRecoverPanic(blder.recoverPanic)
179+
w := &admission.Webhook{
180+
Handler: handler,
181+
}
182+
if blder.recoverPanic != nil {
183+
w = w.WithRecoverPanic(*blder.recoverPanic)
184+
}
185+
return w
168186
}
169-
blder.mgr.GetLogger().Info(
170-
"skip registering a mutating webhook, WithMutationHandler wasn't called",
171-
"GVK", blder.gvk)
172187
return nil
173188
}
174189

175190
// registerValidatingWebhook registers a validating webhook if necessary.
176-
func (blder *Builder) registerValidatingWebhook() {
191+
func (blder *WebhookBuilder) registerValidatingWebhook() {
177192
vwh := blder.getValidatingWebhook()
178193
if vwh != nil {
179194
vwh.LogConstructor = blder.logConstructor
@@ -182,25 +197,27 @@ func (blder *Builder) registerValidatingWebhook() {
182197
// Checking if the path is already registered.
183198
// If so, just skip it.
184199
if !blder.isAlreadyHandled(path) {
185-
blder.mgr.GetLogger().Info("Registering a validating webhook",
200+
log := blder.mgr.GetLogger()
201+
log.Info("Registering a validating webhook",
186202
"GVK", blder.gvk,
187203
"path", path)
188204
blder.mgr.GetWebhookServer().Register(path, vwh)
189205
}
190206
}
191207
}
192208

193-
func (blder *Builder) getValidatingWebhook() *admission.Webhook {
209+
func (blder *WebhookBuilder) getValidatingWebhook() *admission.Webhook {
194210
if validator := blder.customValidator; validator != nil {
195-
return admission.WithCustomValidator(blder.mgr.GetScheme(), blder.apiType, validator).WithRecoverPanic(blder.recoverPanic)
211+
w := admission.WithCustomValidator(blder.mgr.GetScheme(), blder.apiType, validator)
212+
if blder.recoverPanic != nil {
213+
w = w.WithRecoverPanic(*blder.recoverPanic)
214+
}
215+
return w
196216
}
197-
blder.mgr.GetLogger().Info(
198-
"skip registering a validating webhook, WithValidator wasn't called",
199-
"GVK", blder.gvk)
200217
return nil
201218
}
202219

203-
func (blder *Builder) registerConversionWebhook() error {
220+
func (blder *WebhookBuilder) registerConversionWebhook() error {
204221
log := blder.mgr.GetLogger()
205222
ok, err := conversion.IsConvertible(blder.mgr.GetScheme(), blder.apiType)
206223
if err != nil {
@@ -217,14 +234,14 @@ func (blder *Builder) registerConversionWebhook() error {
217234
return nil
218235
}
219236

220-
func (blder *Builder) getType() (runtime.Object, error) {
237+
func (blder *WebhookBuilder) getType() (runtime.Object, error) {
221238
if blder.apiType != nil {
222239
return blder.apiType, nil
223240
}
224241
return nil, errors.New("For() must be called with a valid object")
225242
}
226243

227-
func (blder *Builder) isAlreadyHandled(path string) bool {
244+
func (blder *WebhookBuilder) isAlreadyHandled(path string) bool {
228245
if blder.mgr.GetWebhookServer().WebhookMux() == nil {
229246
return false
230247
}

pkg/controller/jobframework/webhook/defaulter.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
2626
)
2727

28-
// WithDefaulter creates a new Handler for a CustomDefaulter interface that drops remove operations.
28+
// WithDefaulter creates a new Handler for a CustomDefaulter interface that **drops** remove operations.
2929
func WithDefaulter(scheme *runtime.Scheme, obj runtime.Object, defaulter admission.CustomDefaulter) admission.Handler {
3030
return &defaulterForType{
3131
Handler: admission.WithCustomDefaulter(scheme, obj, defaulter).Handler,
@@ -36,7 +36,7 @@ type defaulterForType struct {
3636
admission.Handler
3737
}
3838

39-
// Handle handles admission requests, dropping remove operations from patches produced by controller-runtime.
39+
// Handle handles admission requests, **dropping** remove operations from patches produced by controller-runtime.
4040
// The controller-runtime handler works by creating a jsondiff from the raw object and the marshalled
4141
// version of the object modified by the defaulter. This generates "remove" operations for fields
4242
// that are not present in the go types, which can occur when Kueue libraries are behind the latest

pkg/controller/jobs/deployment/deployment_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func SetupWebhook(mgr ctrl.Manager, opts ...jobframework.Option) error {
4545
manageJobsWithoutQueueName: options.ManageJobsWithoutQueueName,
4646
}
4747
obj := &appsv1.Deployment{}
48-
return webhook.ManagedBy(mgr).
48+
return webhook.WebhookManagedBy(mgr).
4949
For(obj).
5050
WithMutationHandler(webhook.WithDefaulter(mgr.GetScheme(), obj, wh)).
5151
WithValidator(wh).

pkg/controller/jobs/job/job_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func SetupWebhook(mgr ctrl.Manager, opts ...jobframework.Option) error {
6262
cache: options.Cache,
6363
}
6464
obj := &batchv1.Job{}
65-
return webhook.ManagedBy(mgr).
65+
return webhook.WebhookManagedBy(mgr).
6666
For(obj).
6767
WithMutationHandler(webhook.WithDefaulter(mgr.GetScheme(), obj, wh)).
6868
WithValidator(wh).

pkg/controller/jobs/jobset/jobset_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func SetupJobSetWebhook(mgr ctrl.Manager, opts ...jobframework.Option) error {
5050
cache: options.Cache,
5151
}
5252
obj := &jobsetapi.JobSet{}
53-
return webhook.ManagedBy(mgr).
53+
return webhook.WebhookManagedBy(mgr).
5454
For(obj).
5555
WithMutationHandler(webhook.WithDefaulter(mgr.GetScheme(), obj, wh)).
5656
WithValidator(wh).

pkg/controller/jobs/pod/pod_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ func SetupWebhook(mgr ctrl.Manager, opts ...jobframework.Option) error {
8181
podSelector: podOpts.PodSelector,
8282
}
8383
obj := &corev1.Pod{}
84-
return webhook.ManagedBy(mgr).
84+
return webhook.WebhookManagedBy(mgr).
8585
For(obj).
8686
WithMutationHandler(webhook.WithDefaulter(mgr.GetScheme(), obj, wh)).
8787
WithValidator(wh).

pkg/controller/jobs/raycluster/raycluster_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func SetupRayClusterWebhook(mgr ctrl.Manager, opts ...jobframework.Option) error
4444
manageJobsWithoutQueueName: options.ManageJobsWithoutQueueName,
4545
}
4646
obj := &rayv1.RayCluster{}
47-
return webhook.ManagedBy(mgr).
47+
return webhook.WebhookManagedBy(mgr).
4848
For(obj).
4949
WithMutationHandler(webhook.WithDefaulter(mgr.GetScheme(), obj, wh)).
5050
WithValidator(wh).

pkg/controller/jobs/rayjob/rayjob_webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func SetupRayJobWebhook(mgr ctrl.Manager, opts ...jobframework.Option) error {
4444
manageJobsWithoutQueueName: options.ManageJobsWithoutQueueName,
4545
}
4646
obj := &rayv1.RayJob{}
47-
return webhook.ManagedBy(mgr).
47+
return webhook.WebhookManagedBy(mgr).
4848
For(obj).
4949
WithMutationHandler(webhook.WithDefaulter(mgr.GetScheme(), obj, wh)).
5050
WithValidator(wh).

0 commit comments

Comments
 (0)