From 60e2ab6ad626e4263324b8f4feab95a57109f8d2 Mon Sep 17 00:00:00 2001 From: Ashing Zheng Date: Tue, 29 Jul 2025 16:22:09 +0800 Subject: [PATCH 1/5] feat: do not watch gateway api when disable Signed-off-by: Ashing Zheng --- internal/manager/controllers.go | 186 +++++++++++++++++++------------- pkg/utils/cluster.go | 88 +++++++++++++++ 2 files changed, 200 insertions(+), 74 deletions(-) create mode 100644 pkg/utils/cluster.go diff --git a/internal/manager/controllers.go b/internal/manager/controllers.go index 0688055d4..a6e4e6260 100644 --- a/internal/manager/controllers.go +++ b/internal/manager/controllers.go @@ -37,6 +37,7 @@ import ( "github.com/apache/apisix-ingress-controller/internal/manager/readiness" "github.com/apache/apisix-ingress-controller/internal/provider" types "github.com/apache/apisix-ingress-controller/internal/types" + "github.com/apache/apisix-ingress-controller/pkg/utils" ) // K8s @@ -97,101 +98,138 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro if err := indexer.SetupIndexer(mgr); err != nil { return nil, err } - return []Controller{ - &controller.GatewayClassReconciler{ + + setupLog := ctrl.LoggerFrom(ctx).WithName("setup") + var controllers []Controller + + // Gateway API Controllers - conditional registration based on API availability + if utils.HasAPIResource(mgr, &gatewayv1.GatewayClass{}) { + controllers = append(controllers, &controller.GatewayClassReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("GatewayClass"), Updater: updater, - }, - &controller.GatewayReconciler{ + }) + } else { + setupLog.Info("Skipping GatewayClass controller setup, API not found in cluster", "api", "gateway.networking.k8s.io/v1.GatewayClass") + } + + if utils.HasAPIResource(mgr, &gatewayv1.Gateway{}) { + controllers = append(controllers, &controller.GatewayReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Gateway"), Provider: pro, Updater: updater, - }, - &controller.HTTPRouteReconciler{ + }) + } else { + setupLog.Info("Skipping Gateway controller setup, API not found in cluster", "api", "gateway.networking.k8s.io/v1.Gateway") + } + + if utils.HasAPIResource(mgr, &gatewayv1.HTTPRoute{}) { + controllers = append(controllers, &controller.HTTPRouteReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("HTTPRoute"), Provider: pro, Updater: updater, Readier: readier, - }, - &controller.IngressReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Ingress"), - Provider: pro, - Updater: updater, - Readier: readier, - }, - &controller.ConsumerReconciler{ + }) + } else { + setupLog.Info("Skipping HTTPRoute controller setup, API not found in cluster", "api", "gateway.networking.k8s.io/v1.HTTPRoute") + } + + // Core Kubernetes Controllers - always register these + controllers = append(controllers, &controller.IngressReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Ingress"), + Provider: pro, + Updater: updater, + Readier: readier, + }) + + controllers = append(controllers, &controller.IngressClassReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("IngressClass"), + Provider: pro, + }) + + // v1alpha1 Extension Controllers - conditional registration + if utils.HasAPIResource(mgr, &v1alpha1.Consumer{}) { + controllers = append(controllers, &controller.ConsumerReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Consumer"), Provider: pro, Updater: updater, Readier: readier, - }, - &controller.IngressClassReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("IngressClass"), - Provider: pro, - }, - &controller.ApisixGlobalRuleReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixGlobalRule"), - Provider: pro, - Updater: updater, - Readier: readier, - }, - &controller.ApisixRouteReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixRoute"), - Provider: pro, - Updater: updater, - Readier: readier, - }, - &controller.ApisixConsumerReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixConsumer"), - Provider: pro, - Updater: updater, - Readier: readier, - }, - &controller.ApisixPluginConfigReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixPluginConfig"), - Updater: updater, - }, - &controller.ApisixTlsReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixTls"), - Provider: pro, - Updater: updater, - Readier: readier, - }, - &controller.ApisixUpstreamReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixUpstream"), - Updater: updater, - }, - &controller.GatewayProxyController{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("GatewayProxy"), - Provider: pro, - }, - }, nil + }) + } else { + setupLog.Info("Skipping Consumer controller setup, API not found in cluster", "api", "apisix.apache.org/v1alpha1.Consumer") + } + + controllers = append(controllers, &controller.GatewayProxyController{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("GatewayProxy"), + Provider: pro, + }) + + // APISIX v2 Controllers - always register these as they are core to the controller + controllers = append(controllers, &controller.ApisixGlobalRuleReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixGlobalRule"), + Provider: pro, + Updater: updater, + Readier: readier, + }) + + controllers = append(controllers, &controller.ApisixRouteReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixRoute"), + Provider: pro, + Updater: updater, + Readier: readier, + }) + + controllers = append(controllers, &controller.ApisixConsumerReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixConsumer"), + Provider: pro, + Updater: updater, + Readier: readier, + }) + + controllers = append(controllers, &controller.ApisixPluginConfigReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixPluginConfig"), + Updater: updater, + }) + + controllers = append(controllers, &controller.ApisixTlsReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixTls"), + Provider: pro, + Updater: updater, + Readier: readier, + }) + + controllers = append(controllers, &controller.ApisixUpstreamReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixUpstream"), + Updater: updater, + }) + + setupLog.Info("Controllers setup completed", "total_controllers", len(controllers)) + return controllers, nil } func registerReadinessGVK(c client.Client, readier readiness.ReadinessManager) { diff --git a/pkg/utils/cluster.go b/pkg/utils/cluster.go new file mode 100644 index 000000000..60cf3235e --- /dev/null +++ b/pkg/utils/cluster.go @@ -0,0 +1,88 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package utils + +import ( + "github.com/go-logr/logr" + "k8s.io/client-go/discovery" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/apache/apisix-ingress-controller/internal/types" +) + +// HasAPIResource checks if a specific API resource is available in the current cluster. +// It uses the Discovery API to query the cluster's available resources and returns true +// if the resource is found, false otherwise. +// +// This function gracefully handles errors and will return false if: +// - The discovery client cannot be created +// - The API server cannot be reached +// - The group/version is not available +// - Any other discovery-related error occurs +// +// Usage: +// +// if HasAPIResource(mgr, &gatewayv1.Gateway{}) { +// // Gateway API is available, register the controller +// } else { +// // Gateway API not available, skip controller setup +// } +func HasAPIResource(mgr ctrl.Manager, obj client.Object) bool { + return HasAPIResourceWithLogger(mgr, obj, ctrl.Log.WithName("api-detection")) +} + +// HasAPIResourceWithLogger is the same as HasAPIResource but accepts a custom logger +// for more detailed debugging information. +func HasAPIResourceWithLogger(mgr ctrl.Manager, obj client.Object, logger logr.Logger) bool { + gvk := types.GvkOf(obj) + groupVersion := gvk.GroupVersion().String() + + logger = logger.WithValues( + "kind", gvk.Kind, + "group", gvk.Group, + "version", gvk.Version, + "groupVersion", groupVersion, + ) + + // Create discovery client + discoveryClient, err := discovery.NewDiscoveryClientForConfig(mgr.GetConfig()) + if err != nil { + logger.Info("failed to create discovery client", "error", err) + return false + } + + // Query server resources for the specific group/version + apiResources, err := discoveryClient.ServerResourcesForGroupVersion(groupVersion) + if err != nil { + // This is expected for unsupported API versions, so we log at debug level + logger.Info("group/version not available in cluster", "error", err) + return false + } + + // Check if the specific kind exists in the resource list + for _, res := range apiResources.APIResources { + if res.Kind == gvk.Kind { + logger.Info("API resource found in cluster") + return true + } + } + + logger.Info("API resource kind not found in group/version") + return false +} From 46afc602f097b42c92a5ef8f913bdc8afb4e2484 Mon Sep 17 00:00:00 2001 From: Ashing Zheng Date: Tue, 29 Jul 2025 17:32:10 +0800 Subject: [PATCH 2/5] fix: r Signed-off-by: Ashing Zheng --- .github/workflows/apisix-conformance-test.yml | 2 +- .github/workflows/apisix-e2e-test.yml | 2 +- pkg/utils/cluster.go | 14 -------------- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/.github/workflows/apisix-conformance-test.yml b/.github/workflows/apisix-conformance-test.yml index 322ca92d9..b6d3dd50c 100644 --- a/.github/workflows/apisix-conformance-test.yml +++ b/.github/workflows/apisix-conformance-test.yml @@ -86,7 +86,7 @@ jobs: ARCH: amd64 ENABLE_PROXY: "false" BASE_IMAGE_TAG: "debug" - ADC_VERSION: "dev" + # ADC_VERSION: "dev" run: | echo "building images..." make build-image diff --git a/.github/workflows/apisix-e2e-test.yml b/.github/workflows/apisix-e2e-test.yml index 84fed26c2..0fd842be5 100644 --- a/.github/workflows/apisix-e2e-test.yml +++ b/.github/workflows/apisix-e2e-test.yml @@ -86,7 +86,7 @@ jobs: ARCH: amd64 ENABLE_PROXY: "false" BASE_IMAGE_TAG: "debug" - ADC_VERSION: "dev" + # ADC_VERSION: "dev" run: | echo "building images..." make build-image diff --git a/pkg/utils/cluster.go b/pkg/utils/cluster.go index 60cf3235e..1d212f50b 100644 --- a/pkg/utils/cluster.go +++ b/pkg/utils/cluster.go @@ -29,20 +29,6 @@ import ( // HasAPIResource checks if a specific API resource is available in the current cluster. // It uses the Discovery API to query the cluster's available resources and returns true // if the resource is found, false otherwise. -// -// This function gracefully handles errors and will return false if: -// - The discovery client cannot be created -// - The API server cannot be reached -// - The group/version is not available -// - Any other discovery-related error occurs -// -// Usage: -// -// if HasAPIResource(mgr, &gatewayv1.Gateway{}) { -// // Gateway API is available, register the controller -// } else { -// // Gateway API not available, skip controller setup -// } func HasAPIResource(mgr ctrl.Manager, obj client.Object) bool { return HasAPIResourceWithLogger(mgr, obj, ctrl.Log.WithName("api-detection")) } From 1d4aacd6e7143bf3455108cbe8f8efadda3c738d Mon Sep 17 00:00:00 2001 From: Ashing Zheng Date: Tue, 29 Jul 2025 17:40:33 +0800 Subject: [PATCH 3/5] fix: r Signed-off-by: Ashing Zheng --- pkg/utils/cluster.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/utils/cluster.go b/pkg/utils/cluster.go index 1d212f50b..2d37f01cd 100644 --- a/pkg/utils/cluster.go +++ b/pkg/utils/cluster.go @@ -56,7 +56,6 @@ func HasAPIResourceWithLogger(mgr ctrl.Manager, obj client.Object, logger logr.L // Query server resources for the specific group/version apiResources, err := discoveryClient.ServerResourcesForGroupVersion(groupVersion) if err != nil { - // This is expected for unsupported API versions, so we log at debug level logger.Info("group/version not available in cluster", "error", err) return false } @@ -64,7 +63,6 @@ func HasAPIResourceWithLogger(mgr ctrl.Manager, obj client.Object, logger logr.L // Check if the specific kind exists in the resource list for _, res := range apiResources.APIResources { if res.Kind == gvk.Kind { - logger.Info("API resource found in cluster") return true } } From 7bf3e464275274b8e3cd085ed5dce23318f0a0ac Mon Sep 17 00:00:00 2001 From: Ashing Zheng Date: Tue, 29 Jul 2025 18:22:50 +0800 Subject: [PATCH 4/5] fix: r Signed-off-by: Ashing Zheng --- internal/manager/controllers.go | 8 ++++---- pkg/utils/cluster.go | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/internal/manager/controllers.go b/internal/manager/controllers.go index a6e4e6260..2a2823cdb 100644 --- a/internal/manager/controllers.go +++ b/internal/manager/controllers.go @@ -111,7 +111,7 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro Updater: updater, }) } else { - setupLog.Info("Skipping GatewayClass controller setup, API not found in cluster", "api", "gateway.networking.k8s.io/v1.GatewayClass") + setupLog.Info("Skipping GatewayClass controller setup, API not found in cluster", "api", utils.FormatGVK(&gatewayv1.GatewayClass{})) } if utils.HasAPIResource(mgr, &gatewayv1.Gateway{}) { @@ -123,7 +123,7 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro Updater: updater, }) } else { - setupLog.Info("Skipping Gateway controller setup, API not found in cluster", "api", "gateway.networking.k8s.io/v1.Gateway") + setupLog.Info("Skipping Gateway controller setup, API not found in cluster", "api", utils.FormatGVK(&gatewayv1.Gateway{})) } if utils.HasAPIResource(mgr, &gatewayv1.HTTPRoute{}) { @@ -136,7 +136,7 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro Readier: readier, }) } else { - setupLog.Info("Skipping HTTPRoute controller setup, API not found in cluster", "api", "gateway.networking.k8s.io/v1.HTTPRoute") + setupLog.Info("Skipping HTTPRoute controller setup, API not found in cluster", "api", utils.FormatGVK(&gatewayv1.HTTPRoute{})) } // Core Kubernetes Controllers - always register these @@ -167,7 +167,7 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro Readier: readier, }) } else { - setupLog.Info("Skipping Consumer controller setup, API not found in cluster", "api", "apisix.apache.org/v1alpha1.Consumer") + setupLog.Info("Skipping Consumer controller setup, API not found in cluster", "api", utils.FormatGVK(&v1alpha1.Consumer{})) } controllers = append(controllers, &controller.GatewayProxyController{ diff --git a/pkg/utils/cluster.go b/pkg/utils/cluster.go index 2d37f01cd..77d7ec48c 100644 --- a/pkg/utils/cluster.go +++ b/pkg/utils/cluster.go @@ -70,3 +70,8 @@ func HasAPIResourceWithLogger(mgr ctrl.Manager, obj client.Object, logger logr.L logger.Info("API resource kind not found in group/version") return false } + +func FormatGVK(obj client.Object) string { + gvk := types.GvkOf(obj) + return gvk.GroupVersion().String() + "." + gvk.Kind +} From 8ff8f2ffcb616be29ee3cf0342b857ff3e8d389f Mon Sep 17 00:00:00 2001 From: Ashing Zheng Date: Wed, 30 Jul 2025 10:19:21 +0800 Subject: [PATCH 5/5] fix: review Signed-off-by: Ashing Zheng --- internal/manager/controllers.go | 185 +++++++++++++++----------------- 1 file changed, 84 insertions(+), 101 deletions(-) diff --git a/internal/manager/controllers.go b/internal/manager/controllers.go index 2a2823cdb..e1f19df8f 100644 --- a/internal/manager/controllers.go +++ b/internal/manager/controllers.go @@ -103,130 +103,113 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro var controllers []Controller // Gateway API Controllers - conditional registration based on API availability - if utils.HasAPIResource(mgr, &gatewayv1.GatewayClass{}) { - controllers = append(controllers, &controller.GatewayClassReconciler{ + for resource, controller := range map[client.Object]Controller{ + &gatewayv1.GatewayClass{}: &controller.GatewayClassReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("GatewayClass"), Updater: updater, - }) - } else { - setupLog.Info("Skipping GatewayClass controller setup, API not found in cluster", "api", utils.FormatGVK(&gatewayv1.GatewayClass{})) - } - - if utils.HasAPIResource(mgr, &gatewayv1.Gateway{}) { - controllers = append(controllers, &controller.GatewayReconciler{ + }, + &gatewayv1.Gateway{}: &controller.GatewayReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Gateway"), Provider: pro, Updater: updater, - }) - } else { - setupLog.Info("Skipping Gateway controller setup, API not found in cluster", "api", utils.FormatGVK(&gatewayv1.Gateway{})) - } - - if utils.HasAPIResource(mgr, &gatewayv1.HTTPRoute{}) { - controllers = append(controllers, &controller.HTTPRouteReconciler{ + }, + &gatewayv1.HTTPRoute{}: &controller.HTTPRouteReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("HTTPRoute"), Provider: pro, Updater: updater, Readier: readier, - }) - } else { - setupLog.Info("Skipping HTTPRoute controller setup, API not found in cluster", "api", utils.FormatGVK(&gatewayv1.HTTPRoute{})) - } - - // Core Kubernetes Controllers - always register these - controllers = append(controllers, &controller.IngressReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Ingress"), - Provider: pro, - Updater: updater, - Readier: readier, - }) - - controllers = append(controllers, &controller.IngressClassReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("IngressClass"), - Provider: pro, - }) - - // v1alpha1 Extension Controllers - conditional registration - if utils.HasAPIResource(mgr, &v1alpha1.Consumer{}) { - controllers = append(controllers, &controller.ConsumerReconciler{ + }, + &v1alpha1.Consumer{}: &controller.ConsumerReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Consumer"), Provider: pro, Updater: updater, Readier: readier, - }) - } else { - setupLog.Info("Skipping Consumer controller setup, API not found in cluster", "api", utils.FormatGVK(&v1alpha1.Consumer{})) + }, + } { + if utils.HasAPIResource(mgr, resource) { + controllers = append(controllers, controller) + } else { + setupLog.Info("Skipping controller setup, API not found in cluster", "api", utils.FormatGVK(resource)) + } } - controllers = append(controllers, &controller.GatewayProxyController{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("GatewayProxy"), - Provider: pro, - }) - - // APISIX v2 Controllers - always register these as they are core to the controller - controllers = append(controllers, &controller.ApisixGlobalRuleReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixGlobalRule"), - Provider: pro, - Updater: updater, - Readier: readier, - }) - - controllers = append(controllers, &controller.ApisixRouteReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixRoute"), - Provider: pro, - Updater: updater, - Readier: readier, - }) - - controllers = append(controllers, &controller.ApisixConsumerReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixConsumer"), - Provider: pro, - Updater: updater, - Readier: readier, - }) - - controllers = append(controllers, &controller.ApisixPluginConfigReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixPluginConfig"), - Updater: updater, - }) - - controllers = append(controllers, &controller.ApisixTlsReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixTls"), - Provider: pro, - Updater: updater, - Readier: readier, - }) - - controllers = append(controllers, &controller.ApisixUpstreamReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixUpstream"), - Updater: updater, - }) + controllers = append(controllers, []Controller{ + // Core Kubernetes Controllers - always register these + &controller.IngressReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("Ingress"), + Provider: pro, + Updater: updater, + Readier: readier, + }, + &controller.IngressClassReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("IngressClass"), + Provider: pro, + }, + // Gateway Proxy Controller - always register this as it is core to the controller + &controller.GatewayProxyController{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("GatewayProxy"), + Provider: pro, + }, + // APISIX v2 Controllers - always register these as they are core to the controller + &controller.ApisixGlobalRuleReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixGlobalRule"), + Provider: pro, + Updater: updater, + Readier: readier, + }, + &controller.ApisixRouteReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixRoute"), + Provider: pro, + Updater: updater, + Readier: readier, + }, + &controller.ApisixConsumerReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixConsumer"), + Provider: pro, + Updater: updater, + Readier: readier, + }, + &controller.ApisixPluginConfigReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixPluginConfig"), + Updater: updater, + }, + &controller.ApisixTlsReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixTls"), + Provider: pro, + Updater: updater, + Readier: readier, + }, + &controller.ApisixUpstreamReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("ApisixUpstream"), + Updater: updater, + }, + }...) setupLog.Info("Controllers setup completed", "total_controllers", len(controllers)) return controllers, nil