From ceb22a9e20b9847530eb8da0ee73751646ca55cf Mon Sep 17 00:00:00 2001 From: Troy Connor Date: Wed, 27 Mar 2024 14:56:55 -0400 Subject: [PATCH] return error if more than one For is used on webhook creation Signed-off-by: Troy Connor --- pkg/builder/webhook.go | 7 ++++++- pkg/builder/webhook_test.go | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pkg/builder/webhook.go b/pkg/builder/webhook.go index 1a3712eff2..ead9f3e07e 100644 --- a/pkg/builder/webhook.go +++ b/pkg/builder/webhook.go @@ -18,6 +18,7 @@ package builder import ( "errors" + "fmt" "net/http" "net/url" "strings" @@ -44,6 +45,7 @@ type WebhookBuilder struct { config *rest.Config recoverPanic bool logConstructor func(base logr.Logger, req *admission.Request) logr.Logger + err error } // WebhookManagedBy returns a new webhook builder. @@ -57,6 +59,9 @@ func WebhookManagedBy(m manager.Manager) *WebhookBuilder { // If the given object implements the admission.Defaulter interface, a MutatingWebhook will be wired for this type. // If the given object implements the admission.Validator interface, a ValidatingWebhook will be wired for this type. func (blder *WebhookBuilder) For(apiType runtime.Object) *WebhookBuilder { + if blder.apiType != nil { + blder.err = fmt.Errorf("For(...) should only be called once, could not assign multiple objects for webhook registration") + } blder.apiType = apiType return blder } @@ -142,7 +147,7 @@ func (blder *WebhookBuilder) registerWebhooks() error { if err != nil { return err } - return nil + return blder.err } // registerDefaultingWebhook registers a defaulting webhook if necessary. diff --git a/pkg/builder/webhook_test.go b/pkg/builder/webhook_test.go index 0ddd9ffff6..4028b549a0 100644 --- a/pkg/builder/webhook_test.go +++ b/pkg/builder/webhook_test.go @@ -662,6 +662,24 @@ func runTests(admissionReviewVersion string) { ExpectWithOffset(1, w.Body).To(ContainSubstring(`"allowed":true`)) ExpectWithOffset(1, w.Body).To(ContainSubstring(`"code":200`)) }) + + It("should send an error when trying to register a webhook with more than one For", func() { + By("creating a controller manager") + m, err := manager.New(cfg, manager.Options{}) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + + By("registering the type in the Scheme") + builder := scheme.Builder{GroupVersion: testDefaulterGVK.GroupVersion()} + builder.Register(&TestDefaulter{}, &TestDefaulterList{}) + err = builder.AddToScheme(m.GetScheme()) + ExpectWithOffset(1, err).NotTo(HaveOccurred()) + + err = WebhookManagedBy(m). + For(&TestDefaulter{}). + For(&TestDefaulter{}). + Complete() + Expect(err).To(HaveOccurred()) + }) } // TestDefaulter.