@@ -19,14 +19,17 @@ package builder
19
19
import (
20
20
"fmt"
21
21
"strings"
22
+ "time"
22
23
23
24
"github.com/go-logr/logr"
24
25
"k8s.io/apimachinery/pkg/runtime"
25
26
"k8s.io/apimachinery/pkg/runtime/schema"
27
+ "k8s.io/client-go/discovery"
26
28
"k8s.io/client-go/rest"
27
29
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
28
30
"sigs.k8s.io/controller-runtime/pkg/controller"
29
31
"sigs.k8s.io/controller-runtime/pkg/handler"
32
+ intctrl "sigs.k8s.io/controller-runtime/pkg/internal/controller"
30
33
"sigs.k8s.io/controller-runtime/pkg/manager"
31
34
"sigs.k8s.io/controller-runtime/pkg/predicate"
32
35
"sigs.k8s.io/controller-runtime/pkg/reconcile"
@@ -57,9 +60,11 @@ func ControllerManagedBy(m manager.Manager) *Builder {
57
60
58
61
// ForInput represents the information set by For method.
59
62
type ForInput struct {
60
- object runtime.Object
61
- predicates []predicate.Predicate
62
- err error
63
+ object runtime.Object
64
+ predicates []predicate.Predicate
65
+ err error
66
+ conditionallyRun bool
67
+ waitTime time.Duration
63
68
}
64
69
65
70
// For defines the type of Object being *reconciled*, and configures the ControllerManagedBy to respond to create / delete /
@@ -252,7 +257,34 @@ func (blder *Builder) doController(r reconcile.Reconciler) error {
252
257
}
253
258
ctrlOptions .Log = ctrlOptions .Log .WithValues ("reconcilerGroup" , gvk .Group , "reconcilerKind" , gvk .Kind )
254
259
255
- // Build the controller and return.
256
- blder .ctrl , err = newController (blder .getControllerName (gvk ), blder .mgr , ctrlOptions )
257
- return err
260
+ // Build the base controller
261
+ baseController , err := controller .NewUnmanaged (blder .getControllerName (gvk ), blder .mgr , ctrlOptions )
262
+ if err != nil {
263
+ return err
264
+ }
265
+
266
+ // Set the builder controller to either the base controller or wrapped as a ConditionalController.
267
+ var ctrl controller.Controller
268
+ if blder .forInput .conditionallyRun {
269
+ dc , err := discovery .NewDiscoveryClientForConfig (blder .mgr .GetConfig ())
270
+ if err != nil {
271
+ return err
272
+ }
273
+ ic := baseController .(* intctrl.Controller )
274
+ ic .SaveWatches ()
275
+ ctrl = & controller.ConditionalController {
276
+ Cache : blder .mgr .GetCache (),
277
+ ConditionalOn : blder .forInput .object ,
278
+ Controller : ic ,
279
+ DiscoveryClient : dc ,
280
+ Scheme : blder .mgr .GetScheme (),
281
+ WaitTime : blder .forInput .waitTime ,
282
+ }
283
+
284
+ } else {
285
+ ctrl = baseController
286
+ }
287
+ blder .ctrl = ctrl
288
+
289
+ return blder .mgr .Add (ctrl )
258
290
}
0 commit comments