Skip to content

Commit 7a3c9ec

Browse files
authored
Merge pull request #2307 from alvaroaleman/flatten-controller-opts
⚠️ Flatten fields in controller.Options
2 parents f7ea9c0 + c1b8baf commit 7a3c9ec

File tree

3 files changed

+156
-13
lines changed

3 files changed

+156
-13
lines changed

pkg/builder/controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ var _ = Describe("application", func() {
217217
instance, err := ControllerManagedBy(m).
218218
For(&appsv1.ReplicaSet{}).
219219
Owns(&appsv1.ReplicaSet{}).
220-
WithOptions(controller.Options{Controller: config.Controller{MaxConcurrentReconciles: maxConcurrentReconciles}}).
220+
WithOptions(controller.Options{MaxConcurrentReconciles: maxConcurrentReconciles}).
221221
Build(noop)
222222
Expect(err).NotTo(HaveOccurred())
223223
Expect(instance).NotTo(BeNil())

pkg/controller/controller.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"k8s.io/client-go/util/workqueue"
2626
"k8s.io/klog/v2"
2727

28-
"sigs.k8s.io/controller-runtime/pkg/config"
2928
"sigs.k8s.io/controller-runtime/pkg/handler"
3029
"sigs.k8s.io/controller-runtime/pkg/internal/controller"
3130
"sigs.k8s.io/controller-runtime/pkg/manager"
@@ -37,7 +36,20 @@ import (
3736

3837
// Options are the arguments for creating a new Controller.
3938
type Options struct {
40-
config.Controller
39+
// MaxConcurrentReconciles is the maximum number of concurrent Reconciles which can be run. Defaults to 1.
40+
MaxConcurrentReconciles int
41+
42+
// CacheSyncTimeout refers to the time limit set to wait for syncing caches.
43+
// Defaults to 2 minutes if not set.
44+
CacheSyncTimeout time.Duration
45+
46+
// RecoverPanic indicates whether the panic caused by reconcile should be recovered.
47+
// Defaults to the Controller.RecoverPanic setting from the Manager if unset.
48+
RecoverPanic *bool
49+
50+
// NeedLeaderElection indicates whether the controller needs to use leader election.
51+
// Defaults to true, which means the controller will use leader election.
52+
NeedLeaderElection *bool
4153

4254
// Reconciler reconciles an object
4355
Reconciler reconcile.Reconciler
@@ -116,11 +128,19 @@ func NewUnmanaged(name string, mgr manager.Manager, options Options) (Controller
116128
}
117129

118130
if options.MaxConcurrentReconciles <= 0 {
119-
options.MaxConcurrentReconciles = 1
131+
if mgr.GetControllerOptions().MaxConcurrentReconciles > 0 {
132+
options.MaxConcurrentReconciles = mgr.GetControllerOptions().MaxConcurrentReconciles
133+
} else {
134+
options.MaxConcurrentReconciles = 1
135+
}
120136
}
121137

122138
if options.CacheSyncTimeout == 0 {
123-
options.CacheSyncTimeout = 2 * time.Minute
139+
if mgr.GetControllerOptions().CacheSyncTimeout != 0 {
140+
options.CacheSyncTimeout = mgr.GetControllerOptions().CacheSyncTimeout
141+
} else {
142+
options.CacheSyncTimeout = 2 * time.Minute
143+
}
124144
}
125145

126146
if options.RateLimiter == nil {
@@ -131,6 +151,10 @@ func NewUnmanaged(name string, mgr manager.Manager, options Options) (Controller
131151
options.RecoverPanic = mgr.GetControllerOptions().RecoverPanic
132152
}
133153

154+
if options.NeedLeaderElection == nil {
155+
options.NeedLeaderElection = mgr.GetControllerOptions().NeedLeaderElection
156+
}
157+
134158
// Create controller with dependencies set
135159
return &controller.Controller{
136160
Do: options.Reconciler,

pkg/controller/controller_test.go

Lines changed: 127 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,10 +154,8 @@ var _ = Describe("controller.Controller", func() {
154154
Expect(err).NotTo(HaveOccurred())
155155

156156
c, err := controller.New("new-controller", m, controller.Options{
157-
Controller: config.Controller{
158-
RecoverPanic: pointer.Bool(false),
159-
},
160-
Reconciler: reconcile.Func(nil),
157+
RecoverPanic: pointer.Bool(false),
158+
Reconciler: reconcile.Func(nil),
161159
})
162160
Expect(err).NotTo(HaveOccurred())
163161

@@ -168,6 +166,129 @@ var _ = Describe("controller.Controller", func() {
168166
Expect(*ctrl.RecoverPanic).To(BeFalse())
169167
})
170168

169+
It("should default NeedLeaderElection from the manager", func() {
170+
m, err := manager.New(cfg, manager.Options{Controller: config.Controller{NeedLeaderElection: pointer.Bool(true)}})
171+
Expect(err).NotTo(HaveOccurred())
172+
173+
c, err := controller.New("new-controller", m, controller.Options{
174+
Reconciler: reconcile.Func(nil),
175+
})
176+
Expect(err).NotTo(HaveOccurred())
177+
178+
ctrl, ok := c.(*internalcontroller.Controller)
179+
Expect(ok).To(BeTrue())
180+
181+
Expect(ctrl.NeedLeaderElection()).To(BeTrue())
182+
})
183+
184+
It("should not override NeedLeaderElection on the controller", func() {
185+
m, err := manager.New(cfg, manager.Options{Controller: config.Controller{NeedLeaderElection: pointer.Bool(true)}})
186+
Expect(err).NotTo(HaveOccurred())
187+
188+
c, err := controller.New("new-controller", m, controller.Options{
189+
NeedLeaderElection: pointer.Bool(false),
190+
Reconciler: reconcile.Func(nil),
191+
})
192+
Expect(err).NotTo(HaveOccurred())
193+
194+
ctrl, ok := c.(*internalcontroller.Controller)
195+
Expect(ok).To(BeTrue())
196+
197+
Expect(ctrl.NeedLeaderElection()).To(BeFalse())
198+
})
199+
200+
It("Should default MaxConcurrentReconciles from the manager if set", func() {
201+
m, err := manager.New(cfg, manager.Options{Controller: config.Controller{MaxConcurrentReconciles: 5}})
202+
Expect(err).NotTo(HaveOccurred())
203+
204+
c, err := controller.New("new-controller", m, controller.Options{
205+
Reconciler: reconcile.Func(nil),
206+
})
207+
Expect(err).NotTo(HaveOccurred())
208+
209+
ctrl, ok := c.(*internalcontroller.Controller)
210+
Expect(ok).To(BeTrue())
211+
212+
Expect(ctrl.MaxConcurrentReconciles).To(BeEquivalentTo(5))
213+
})
214+
215+
It("Should default MaxConcurrentReconciles to 1 if unset", func() {
216+
m, err := manager.New(cfg, manager.Options{})
217+
Expect(err).NotTo(HaveOccurred())
218+
219+
c, err := controller.New("new-controller", m, controller.Options{
220+
Reconciler: reconcile.Func(nil),
221+
})
222+
Expect(err).NotTo(HaveOccurred())
223+
224+
ctrl, ok := c.(*internalcontroller.Controller)
225+
Expect(ok).To(BeTrue())
226+
227+
Expect(ctrl.MaxConcurrentReconciles).To(BeEquivalentTo(1))
228+
})
229+
230+
It("Should leave MaxConcurrentReconciles if set", func() {
231+
m, err := manager.New(cfg, manager.Options{})
232+
Expect(err).NotTo(HaveOccurred())
233+
234+
c, err := controller.New("new-controller", m, controller.Options{
235+
Reconciler: reconcile.Func(nil),
236+
MaxConcurrentReconciles: 5,
237+
})
238+
Expect(err).NotTo(HaveOccurred())
239+
240+
ctrl, ok := c.(*internalcontroller.Controller)
241+
Expect(ok).To(BeTrue())
242+
243+
Expect(ctrl.MaxConcurrentReconciles).To(BeEquivalentTo(5))
244+
})
245+
246+
It("Should default CacheSyncTimeout from the manager if set", func() {
247+
m, err := manager.New(cfg, manager.Options{Controller: config.Controller{CacheSyncTimeout: 5}})
248+
Expect(err).NotTo(HaveOccurred())
249+
250+
c, err := controller.New("new-controller", m, controller.Options{
251+
Reconciler: reconcile.Func(nil),
252+
})
253+
Expect(err).NotTo(HaveOccurred())
254+
255+
ctrl, ok := c.(*internalcontroller.Controller)
256+
Expect(ok).To(BeTrue())
257+
258+
Expect(ctrl.CacheSyncTimeout).To(BeEquivalentTo(5))
259+
})
260+
261+
It("Should default CacheSyncTimeout to 2 minutes if unset", func() {
262+
m, err := manager.New(cfg, manager.Options{})
263+
Expect(err).NotTo(HaveOccurred())
264+
265+
c, err := controller.New("new-controller", m, controller.Options{
266+
Reconciler: reconcile.Func(nil),
267+
})
268+
Expect(err).NotTo(HaveOccurred())
269+
270+
ctrl, ok := c.(*internalcontroller.Controller)
271+
Expect(ok).To(BeTrue())
272+
273+
Expect(ctrl.CacheSyncTimeout).To(BeEquivalentTo(2 * time.Minute))
274+
})
275+
276+
It("Should leave CacheSyncTimeout if set", func() {
277+
m, err := manager.New(cfg, manager.Options{})
278+
Expect(err).NotTo(HaveOccurred())
279+
280+
c, err := controller.New("new-controller", m, controller.Options{
281+
Reconciler: reconcile.Func(nil),
282+
CacheSyncTimeout: 5,
283+
})
284+
Expect(err).NotTo(HaveOccurred())
285+
286+
ctrl, ok := c.(*internalcontroller.Controller)
287+
Expect(ok).To(BeTrue())
288+
289+
Expect(ctrl.CacheSyncTimeout).To(BeEquivalentTo(5))
290+
})
291+
171292
It("should default NeedLeaderElection on the controller to true", func() {
172293
m, err := manager.New(cfg, manager.Options{})
173294
Expect(err).NotTo(HaveOccurred())
@@ -188,10 +309,8 @@ var _ = Describe("controller.Controller", func() {
188309
Expect(err).NotTo(HaveOccurred())
189310

190311
c, err := controller.New("new-controller", m, controller.Options{
191-
Controller: config.Controller{
192-
NeedLeaderElection: pointer.Bool(false),
193-
},
194-
Reconciler: rec,
312+
NeedLeaderElection: pointer.Bool(false),
313+
Reconciler: rec,
195314
})
196315
Expect(err).NotTo(HaveOccurred())
197316

0 commit comments

Comments
 (0)