Skip to content

Commit 8984b30

Browse files
Remove builder requirements from generic wrapper methods
Signed-off-by: Danil Grigorev <[email protected]>
1 parent 4d77004 commit 8984b30

File tree

2 files changed

+61
-11
lines changed

2 files changed

+61
-11
lines changed

example_test.go

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ func GenericExample() {
8787

8888
b := ctrl.NewControllerManagedBy(manager) // Create the Controller
8989
// ReplicaSet is the Application API
90-
b.Add(builder.For(b, &appsv1.ReplicaSet{})).
91-
Add(builder.Owns(b, &appsv1.ReplicaSet{}, &corev1.Pod{})). // ReplicaSet owns Pods created by it
90+
b.Add(builder.For(manager, &appsv1.ReplicaSet{})).
91+
Add(builder.Owns(manager, &appsv1.ReplicaSet{}, &corev1.Pod{})). // ReplicaSet owns Pods created by it
9292
Complete(&ReplicaSetReconciler{Client: manager.GetClient()})
9393
if err != nil {
9494
log.Error(err, "could not create controller")
@@ -189,6 +189,58 @@ func Example_customHandler() {
189189
}
190190
}
191191

192+
// This example creates a simple application Controller that is configured for ExampleCRDWithConfigMapRef CRD.
193+
// Any change in the configMap referenced in this Custom Resource will cause the re-reconcile of the parent ExampleCRDWithConfigMapRef
194+
// due to the implementation of the .Watches method of "sigs.k8s.io/controller-runtime/pkg/builder".Builder.
195+
func Example_generic_customHandler() {
196+
log := ctrl.Log.WithName("builder-examples")
197+
198+
manager, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{})
199+
if err != nil {
200+
log.Error(err, "could not create manager")
201+
os.Exit(1)
202+
}
203+
204+
err = ctrl.
205+
NewControllerManagedBy(manager).
206+
For(&ExampleCRDWithConfigMapRef{}).
207+
Add(builder.Watches(manager, &corev1.ConfigMap{}, handler.EnqueueRequestsFromObjectMap(func(ctx context.Context, cm *corev1.ConfigMap) []ctrl.Request {
208+
// map a change from referenced configMap to ExampleCRDWithConfigMapRef, which causes its re-reconcile
209+
crList := &ExampleCRDWithConfigMapRefList{}
210+
if err := manager.GetClient().List(ctx, crList); err != nil {
211+
manager.GetLogger().Error(err, "while listing ExampleCRDWithConfigMapRefs")
212+
return nil
213+
}
214+
215+
reqs := make([]ctrl.Request, 0, len(crList.Items))
216+
for _, item := range crList.Items {
217+
if item.ConfigMapRef.Name == cm.Name && cm.Data["Namespace"] == item.GetNamespace() {
218+
reqs = append(reqs, ctrl.Request{
219+
NamespacedName: types.NamespacedName{
220+
Namespace: item.GetNamespace(),
221+
Name: item.GetName(),
222+
},
223+
})
224+
}
225+
}
226+
227+
return reqs
228+
}))).
229+
Complete(reconcile.Func(func(ctx context.Context, r reconcile.Request) (reconcile.Result, error) {
230+
// Your business logic to implement the API by creating, updating, deleting objects goes here.
231+
return reconcile.Result{}, nil
232+
}))
233+
if err != nil {
234+
log.Error(err, "could not create controller")
235+
os.Exit(1)
236+
}
237+
238+
if err := manager.Start(ctrl.SetupSignalHandler()); err != nil {
239+
log.Error(err, "could not start manager")
240+
os.Exit(1)
241+
}
242+
}
243+
192244
// This example creates a simple application Controller that is configured for ReplicaSets and Pods.
193245
// This application controller will be running leader election with the provided configuration in the manager options.
194246
// If leader election configuration is not provided, controller runs leader election with default values.

pkg/builder/controller.go

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,25 +187,23 @@ func (blder *Builder) WatchesRawSource(src source.PrepareSyncing, eventHandler h
187187
return blder
188188
}
189189

190-
func For[T client.Object](blder *Builder, object T, prct ...predicate.ObjectPredicate[T]) source.Source {
191-
blder.forInput = ForInput{object: object}
192-
193-
return source.ObjectKind(blder.mgr.GetCache(), object).PrepareObject(&handler.EnqueueRequest[T]{}, prct...)
190+
func For[T client.Object](mgr manager.Manager, object T, prct ...predicate.ObjectPredicate[T]) source.Source {
191+
return source.ObjectKind(mgr.GetCache(), object).PrepareObject(&handler.EnqueueRequest[T]{}, prct...)
194192
}
195193

196-
func Owns[F, T client.Object](blder *Builder, owner F, owned T, prct ...predicate.ObjectPredicate[T]) source.Source {
197-
src := source.ObjectKind(blder.mgr.GetCache(), owned)
194+
func Owns[F, T client.Object](mgr manager.Manager, owner F, owned T, prct ...predicate.ObjectPredicate[T]) source.Source {
195+
src := source.ObjectKind(mgr.GetCache(), owned)
198196

199197
hdler := handler.EnqueueRequestForOwner(
200-
blder.mgr.GetScheme(), blder.mgr.GetRESTMapper(),
198+
mgr.GetScheme(), mgr.GetRESTMapper(),
201199
owner,
202200
)
203201

204202
return src.PrepareObject(handler.ObjectFuncAdapter[T](hdler), prct...)
205203
}
206204

207-
func Watches[T client.Object](blder *Builder, object T, eventHandler handler.ObjectHandler[T], prct ...predicate.ObjectPredicate[T]) source.Source {
208-
return source.ObjectKind(blder.mgr.GetCache(), object).PrepareObject(eventHandler, prct...)
205+
func Watches[T client.Object](mgr manager.Manager, object T, eventHandler handler.ObjectHandler[T], prct ...predicate.ObjectPredicate[T]) source.Source {
206+
return source.ObjectKind(mgr.GetCache(), object).PrepareObject(eventHandler, prct...)
209207
}
210208

211209
func (blder *Builder) Add(src source.Source) *Builder {

0 commit comments

Comments
 (0)