in internal/controllers/watch/kind.go [67:124]
func (k *KindWatchController) newResourceWatchController(parent *WatchController, ref *metav1.PartialObjectMetadata) (controller.Controller, error) {
rrc, err := controller.NewUnmanaged("kindWatchController", parent.mgr, controller.Options{
LogConstructor: manager.NewLogConstructor(parent.mgr, "kindWatchController"),
RateLimiter: &workqueue.TypedBucketRateLimiter[reconcile.Request]{
// Be careful about feedback loops - low, hardcoded rate limits make sense here.
// Maybe expose as a flag in the future.
Limiter: rate.NewLimiter(rate.Every(time.Second), 2),
},
Reconciler: k,
})
if err != nil {
return nil, err
}
// Watch the input resources
err = rrc.Watch(source.Kind(parent.mgr.GetCache(), ref, &handler.TypedEnqueueRequestForObject[*metav1.PartialObjectMetadata]{}))
if err != nil {
return nil, err
}
// Watch inputs declared by refs/bindings in synthesizers/compositions
err = rrc.Watch(source.Kind(parent.mgr.GetCache(), &apiv1.Composition{},
handler.TypedEnqueueRequestsFromMapFunc(handler.TypedMapFunc[*apiv1.Composition, reconcile.Request](func(ctx context.Context, comp *apiv1.Composition) []reconcile.Request {
if comp.Spec.Synthesizer.Name == "" {
return nil
}
synth := &apiv1.Synthesizer{}
err = parent.client.Get(ctx, types.NamespacedName{Name: comp.Spec.Synthesizer.Name}, synth)
if err != nil {
logr.FromContextOrDiscard(ctx).Error(err, "unable to get synthesizer for composition")
return nil
}
return k.buildRequests(synth, *comp)
}))))
if err != nil {
return nil, err
}
err = rrc.Watch(source.Kind(parent.mgr.GetCache(), &apiv1.Synthesizer{},
handler.TypedEnqueueRequestsFromMapFunc(handler.TypedMapFunc[*apiv1.Synthesizer, reconcile.Request](func(ctx context.Context, synth *apiv1.Synthesizer) []reconcile.Request {
compList := &apiv1.CompositionList{}
err = parent.client.List(ctx, compList, client.MatchingFields{
manager.IdxCompositionsBySynthesizer: synth.Name,
})
if err != nil {
logr.FromContextOrDiscard(ctx).Error(err, "unable to get compositions for synthesizer")
return nil
}
return k.buildRequests(synth, compList.Items...)
}))))
if err != nil {
return nil, err
}
return rrc, err
}