func()

in pkg/controllers/hub/internalserviceimport/controller.go [173:223]


func (r *Reconciler) SetupWithManager(ctx context.Context, mgr ctrl.Manager) error {
	// Set up an index for efficient InternalServiceImport lookup.
	internalSvcImportIndexerFunc := func(o client.Object) []string {
		internalSvcImport, ok := o.(*fleetnetv1alpha1.InternalServiceImport)
		if !ok {
			return []string{}
		}
		return []string{internalSvcImport.Spec.ServiceImportReference.NamespacedName}
	}
	if err := mgr.GetFieldIndexer().IndexField(ctx,
		&fleetnetv1alpha1.InternalServiceImport{},
		internalSvcImportSvcRefNamespacedNameFieldKey,
		internalSvcImportIndexerFunc,
	); err != nil {
		klog.ErrorS(err, "Failed to set up InternalServiceImport index")
		return err
	}

	// Enqueue InternalServiceImports for processing when a ServiceImport changes.
	eventHandlers := handler.EnqueueRequestsFromMapFunc(func(_ context.Context, o client.Object) []reconcile.Request {
		svcImport, ok := o.(*fleetnetv1alpha1.ServiceImport)
		if !ok {
			return []reconcile.Request{}
		}

		internalSvcImportList := &fleetnetv1alpha1.InternalServiceImportList{}
		fieldMatcher := client.MatchingFields{
			internalSvcImportSvcRefNamespacedNameFieldKey: fmt.Sprintf("%s/%s", svcImport.Namespace, svcImport.Name),
		}
		if err := r.HubClient.List(ctx, internalSvcImportList, fieldMatcher); err != nil {
			klog.ErrorS(err, "Failed to list InternalServiceImports for an ServiceImport", "serviceImport", klog.KObj(svcImport))
			return []reconcile.Request{}
		}

		reqs := make([]reconcile.Request, 0, len(internalSvcImportList.Items))
		for _, internalSvcImport := range internalSvcImportList.Items {
			reqs = append(reqs, reconcile.Request{
				NamespacedName: types.NamespacedName{
					Namespace: internalSvcImport.Namespace,
					Name:      internalSvcImport.Name,
				},
			})
		}
		return reqs
	})

	return ctrl.NewControllerManagedBy(mgr).
		For(&fleetnetv1alpha1.InternalServiceImport{}).
		Watches(&fleetnetv1alpha1.ServiceImport{}, eventHandlers).
		Complete(r)
}