diff --git a/pkg/builder/controller.go b/pkg/builder/controller.go index d89f3696ff..306e26d8b9 100644 --- a/pkg/builder/controller.go +++ b/pkg/builder/controller.go @@ -47,6 +47,7 @@ type Builder struct { watchRequest []watchRequest config *rest.Config ctrl controller.Controller + ctrlOptions controller.Options name string } @@ -125,6 +126,12 @@ func (blder *Builder) WithEventFilter(p predicate.Predicate) *Builder { return blder } +// WithOptions overrides the controller options use in doController. Defaults to empty. +func (blder *Builder) WithOptions(options controller.Options) *Builder { + blder.ctrlOptions = options + return blder +} + // Named sets the name of the controller to the given name. The name shows up // in metrics, among other things, and thus should be a prometheus compatible name // (underscores and alphanumeric characters only). @@ -241,6 +248,8 @@ func (blder *Builder) doController(r reconcile.Reconciler) error { if err != nil { return err } - blder.ctrl, err = newController(name, blder.mgr, controller.Options{Reconciler: r}) + ctrlOptions := blder.ctrlOptions + ctrlOptions.Reconciler = r + blder.ctrl, err = newController(name, blder.mgr, ctrlOptions) return err } diff --git a/pkg/builder/controller_test.go b/pkg/builder/controller_test.go index 29917edbe5..601fa84e63 100644 --- a/pkg/builder/controller_test.go +++ b/pkg/builder/controller_test.go @@ -121,6 +121,24 @@ var _ = Describe("application", func() { Expect(instance).To(BeNil()) }) + It("should override max concurrent reconcilers during creation of controller", func() { + const maxConcurrentReconciles = 5 + newController = func(name string, mgr manager.Manager, options controller.Options) ( + controller.Controller, error) { + if options.MaxConcurrentReconciles == maxConcurrentReconciles { + return controller.New(name, mgr, options) + } + return nil, fmt.Errorf("max concurrent reconcilers expected %d but found %d", maxConcurrentReconciles, options.MaxConcurrentReconciles) + } + instance, err := SimpleController(). + For(&appsv1.ReplicaSet{}). + Owns(&appsv1.ReplicaSet{}). + WithOptions(controller.Options{MaxConcurrentReconciles: maxConcurrentReconciles}). + Build(noop) + Expect(err).NotTo(HaveOccurred()) + Expect(instance).NotTo(BeNil()) + }) + It("should allow multiple controllers for the same kind", func() { By("creating a controller manager") m, err := manager.New(cfg, manager.Options{})