func()

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
}