func RegisterAllRouteControllers()

in pkg/controllers/route_controller.go [81:152]


func RegisterAllRouteControllers(
	log gwlog.Logger,
	cloud aws.Cloud,
	finalizerManager k8s.FinalizerManager,
	mgr ctrl.Manager,
) error {
	mgrClient := mgr.GetClient()
	gwEventHandler := eventhandlers.NewEnqueueRequestGatewayEvent(log, mgrClient)
	svcEventHandler := eventhandlers.NewServiceEventHandler(log, mgrClient)

	routeInfos := []struct {
		routeType      core.RouteType
		gatewayApiType client.Object
	}{
		{core.HttpRouteType, &gwv1.HTTPRoute{}},
		{core.GrpcRouteType, &gwv1.GRPCRoute{}},
		{core.TlsRouteType, &gwv1alpha2.TLSRoute{}},
	}

	for _, routeInfo := range routeInfos {
		brTgBuilder := gateway.NewBackendRefTargetGroupBuilder(log, mgrClient)
		reconciler := routeReconciler{
			routeType:        routeInfo.routeType,
			log:              log,
			client:           mgrClient,
			scheme:           mgr.GetScheme(),
			finalizerManager: finalizerManager,
			eventRecorder:    mgr.GetEventRecorderFor(string(routeInfo.routeType) + "route"),
			modelBuilder:     gateway.NewLatticeServiceBuilder(log, mgrClient, brTgBuilder),
			stackDeployer:    deploy.NewLatticeServiceStackDeploy(log, cloud, mgrClient),
			stackMarshaller:  deploy.NewDefaultStackMarshaller(),
			cloud:            cloud,
		}

		svcImportEventHandler := eventhandlers.NewServiceImportEventHandler(log, mgrClient)

		builder := ctrl.NewControllerManagedBy(mgr).
			For(routeInfo.gatewayApiType, builder.WithPredicates(predicate.GenerationChangedPredicate{})).
			Watches(&gwv1.Gateway{}, gwEventHandler).
			Watches(&corev1.Service{}, svcEventHandler.MapToRoute(routeInfo.routeType)).
			Watches(&anv1alpha1.ServiceImport{}, svcImportEventHandler.MapToRoute(routeInfo.routeType)).
			Watches(&discoveryv1.EndpointSlice{}, svcEventHandler.MapToRoute(routeInfo.routeType)).
			WithOptions(controller.Options{
				MaxConcurrentReconciles: config.RouteMaxConcurrentReconciles,
			})

		if ok, err := k8s.IsGVKSupported(mgr, anv1alpha1.GroupVersion.String(), anv1alpha1.TargetGroupPolicyKind); ok {
			builder.Watches(&anv1alpha1.TargetGroupPolicy{}, svcEventHandler.MapToRoute(routeInfo.routeType))
		} else {
			if err != nil {
				return err
			}
			log.Infof(context.TODO(), "TargetGroupPolicy CRD is not installed, skipping watch")
		}

		if ok, err := k8s.IsGVKSupported(mgr, "externaldns.k8s.io/v1alpha1", "DNSEndpoint"); ok {
			builder.Owns(&endpoint.DNSEndpoint{})
		} else {
			if err != nil {
				return err
			}
			log.Infof(context.TODO(), "DNSEndpoint CRD is not installed, skipping watch")
		}

		err := builder.Complete(&reconciler)
		if err != nil {
			return err
		}
	}

	return nil
}