diff --git a/pkg/builder/controller.go b/pkg/builder/controller.go index 0fee47b8af..b3324eb54e 100644 --- a/pkg/builder/controller.go +++ b/pkg/builder/controller.go @@ -245,7 +245,9 @@ func (blder *Builder) doController(r reconcile.Reconciler) error { return err } ctrlOptions := blder.ctrlOptions - ctrlOptions.Reconciler = r + if ctrlOptions.Reconciler == nil { + 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 b2913d63e0..3693bbaee6 100644 --- a/pkg/builder/controller_test.go +++ b/pkg/builder/controller_test.go @@ -41,6 +41,12 @@ import ( "sigs.k8s.io/controller-runtime/pkg/source" ) +type typedNoop struct{} + +func (typedNoop) Reconcile(reconcile.Request) (reconcile.Result, error) { + return reconcile.Result{}, nil +} + var _ = Describe("application", func() { var stop chan struct{} @@ -151,6 +157,27 @@ var _ = Describe("application", func() { Expect(instance).NotTo(BeNil()) }) + It("should prefer reconciler from options during creation of controller", func() { + newController = func(name string, mgr manager.Manager, options controller.Options) (controller.Controller, error) { + if options.Reconciler != (typedNoop{}) { + return nil, fmt.Errorf("Custom reconciler expected %T but found %T", typedNoop{}, options.Reconciler) + } + return controller.New(name, mgr, options) + } + + By("creating a controller manager") + m, err := manager.New(cfg, manager.Options{}) + Expect(err).NotTo(HaveOccurred()) + + instance, err := ControllerManagedBy(m). + For(&appsv1.ReplicaSet{}). + Owns(&appsv1.ReplicaSet{}). + WithOptions(controller.Options{Reconciler: typedNoop{}}). + 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{})