Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/samples/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ secure_metrics: false # The secure metrics configuration.
exec_adc_timeout: 15s # The timeout for the ADC to execute.
# The default value is 15 seconds.

disable_gateway_api: false # Whether to disable the Gateway API support.
# The default value is false.

provider:
type: "api7ee"

Expand Down
40 changes: 40 additions & 0 deletions internal/controller/config/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package config

import (
"os"
"testing"

"github.com/stretchr/testify/assert"
)

func TestNewDefaultConfig(t *testing.T) {
cfg := NewDefaultConfig()
assert.NotNil(t, cfg)
assert.Equal(t, DefaultLogLevel, cfg.LogLevel)
assert.Equal(t, DefaultControllerName, cfg.ControllerName)
assert.Equal(t, DefaultLeaderElectionID, cfg.LeaderElectionID)
}

func TestNewConfigFromFile(t *testing.T) {
// Create a temporary config file
fileContent := `
log_level: debug
controller_name: test-controller
disable_gateway_api: true
`
tempFile, err := os.CreateTemp("", "config-*.yaml")
assert.NoError(t, err)
defer func() {
_ = os.Remove(tempFile.Name())
}()

_, err = tempFile.WriteString(fileContent)
assert.NoError(t, err)
_ = tempFile.Close()

cfg, err := NewConfigFromFile(tempFile.Name())
assert.NoError(t, err)
assert.Equal(t, "debug", cfg.LogLevel)
assert.Equal(t, "test-controller", cfg.ControllerName)
assert.Equal(t, true, cfg.DisableGatewayAPI)
}
27 changes: 14 additions & 13 deletions internal/controller/config/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,19 +56,20 @@ const (
// Config contains all config items which are necessary for
// apisix-ingress-controller's running.
type Config struct {
LogLevel string `json:"log_level" yaml:"log_level"`
ControllerName string `json:"controller_name" yaml:"controller_name"`
LeaderElectionID string `json:"leader_election_id" yaml:"leader_election_id"`
MetricsAddr string `json:"metrics_addr" yaml:"metrics_addr"`
ServerAddr string `json:"server_addr" yaml:"server_addr"`
EnableServer bool `json:"enable_server" yaml:"enable_server"`
EnableHTTP2 bool `json:"enable_http2" yaml:"enable_http2"`
ProbeAddr string `json:"probe_addr" yaml:"probe_addr"`
SecureMetrics bool `json:"secure_metrics" yaml:"secure_metrics"`
LeaderElection *LeaderElection `json:"leader_election" yaml:"leader_election"`
ExecADCTimeout types.TimeDuration `json:"exec_adc_timeout" yaml:"exec_adc_timeout"`
ProviderConfig ProviderConfig `json:"provider" yaml:"provider"`
Webhook *WebhookConfig `json:"webhook" yaml:"webhook"`
LogLevel string `json:"log_level" yaml:"log_level"`
ControllerName string `json:"controller_name" yaml:"controller_name"`
LeaderElectionID string `json:"leader_election_id" yaml:"leader_election_id"`
MetricsAddr string `json:"metrics_addr" yaml:"metrics_addr"`
ServerAddr string `json:"server_addr" yaml:"server_addr"`
EnableServer bool `json:"enable_server" yaml:"enable_server"`
EnableHTTP2 bool `json:"enable_http2" yaml:"enable_http2"`
ProbeAddr string `json:"probe_addr" yaml:"probe_addr"`
SecureMetrics bool `json:"secure_metrics" yaml:"secure_metrics"`
LeaderElection *LeaderElection `json:"leader_election" yaml:"leader_election"`
ExecADCTimeout types.TimeDuration `json:"exec_adc_timeout" yaml:"exec_adc_timeout"`
ProviderConfig ProviderConfig `json:"provider" yaml:"provider"`
Webhook *WebhookConfig `json:"webhook" yaml:"webhook"`
DisableGatewayAPI bool `json:"disable_gateway_api" yaml:"disable_gateway_api"`
}

type GatewayConfig struct {
Expand Down
55 changes: 30 additions & 25 deletions internal/controller/indexer/indexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import (

"github.com/apache/apisix-ingress-controller/api/v1alpha1"
apiv2 "github.com/apache/apisix-ingress-controller/api/v2"
"github.com/apache/apisix-ingress-controller/internal/controller/config"
internaltypes "github.com/apache/apisix-ingress-controller/internal/types"
k8sutils "github.com/apache/apisix-ingress-controller/internal/utils"
"github.com/apache/apisix-ingress-controller/pkg/utils"
Expand All @@ -59,14 +60,27 @@ func SetupIndexer(mgr ctrl.Manager) error {
setupLog := ctrl.LoggerFrom(context.Background()).WithName("indexer-setup")

// Gateway API indexers - conditional setup based on API availability
if !config.ControllerConfig.DisableGatewayAPI {
for resource, setup := range map[client.Object]func(ctrl.Manager) error{
&gatewayv1.Gateway{}: setupGatewayIndexer,
&gatewayv1.HTTPRoute{}: setupHTTPRouteIndexer,
&gatewayv1.GRPCRoute{}: setupGRPCRouteIndexer,
&gatewayv1alpha2.TCPRoute{}: setupTCPRouteIndexer,
&gatewayv1alpha2.UDPRoute{}: setupUDPRouteIndexer,
&gatewayv1.GatewayClass{}: setupGatewayClassIndexer,
&v1alpha1.Consumer{}: setupConsumerIndexer,
} {
if utils.HasAPIResource(mgr, resource) {
if err := setup(mgr); err != nil {
return err
}
} else {
setupLog.Info("Skipping indexer setup, API not found in cluster", "api", utils.FormatGVK(resource))
}
}
}

for resource, setup := range map[client.Object]func(ctrl.Manager) error{
&gatewayv1.Gateway{}: setupGatewayIndexer,
&gatewayv1.HTTPRoute{}: setupHTTPRouteIndexer,
&gatewayv1.GRPCRoute{}: setupGRPCRouteIndexer,
&gatewayv1alpha2.TCPRoute{}: setupTCPRouteIndexer,
&gatewayv1alpha2.UDPRoute{}: setupUDPRouteIndexer,
&gatewayv1.GatewayClass{}: setupGatewayClassIndexer,
&v1alpha1.Consumer{}: setupConsumerIndexer,
&networkingv1.Ingress{}: setupIngressIndexer,
&networkingv1.IngressClass{}: setupIngressClassIndexer,
&networkingv1beta1.IngressClass{}: setupIngressClassV1beta1Indexer,
Expand All @@ -81,15 +95,6 @@ func SetupIndexer(mgr ctrl.Manager) error {
}
}

// Gateway secret index needs conditional setup since it uses Gateway API
if utils.HasAPIResource(mgr, &gatewayv1.Gateway{}) {
if err := setupGatewaySecretIndex(mgr); err != nil {
return err
}
} else {
setupLog.Info("Skipping indexer setup, API not found in cluster", "api", utils.FormatGVK(&gatewayv1.Gateway{}))
}

// Core Kubernetes and APISIX indexers - always setup these
for _, setup := range []func(ctrl.Manager) error{
setupGatewayProxyIndexer,
Expand Down Expand Up @@ -125,6 +130,15 @@ func setupGatewayIndexer(mgr ctrl.Manager) error {
); err != nil {
return err
}

if err := mgr.GetFieldIndexer().IndexField(
context.Background(),
&gatewayv1.Gateway{},
SecretIndexRef,
GatewaySecretIndexFunc,
); err != nil {
return err
}
return nil
}

Expand Down Expand Up @@ -371,15 +385,6 @@ func setupGatewayProxyIndexer(mgr ctrl.Manager) error {
return nil
}

func setupGatewaySecretIndex(mgr ctrl.Manager) error {
return mgr.GetFieldIndexer().IndexField(
context.Background(),
&gatewayv1.Gateway{},
SecretIndexRef,
GatewaySecretIndexFunc,
)
}

func setupGatewayClassIndexer(mgr ctrl.Manager) error {
return mgr.GetFieldIndexer().IndexField(
context.Background(),
Expand Down
128 changes: 73 additions & 55 deletions internal/manager/controllers.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import (
"github.com/apache/apisix-ingress-controller/api/v1alpha1"
apiv2 "github.com/apache/apisix-ingress-controller/api/v2"
"github.com/apache/apisix-ingress-controller/internal/controller"
"github.com/apache/apisix-ingress-controller/internal/controller/config"
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
"github.com/apache/apisix-ingress-controller/internal/controller/status"
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
Expand Down Expand Up @@ -125,60 +126,73 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro
}

// Gateway API Controllers - conditional registration based on API availability
if !config.ControllerConfig.DisableGatewayAPI {
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(types.KindGatewayClass),
Updater: updater,
},
&gatewayv1.Gateway{}: &controller.GatewayReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGateway),
Provider: pro,
Updater: updater,
},
&gatewayv1.HTTPRoute{}: &controller.HTTPRouteReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindHTTPRoute),
Provider: pro,
Updater: updater,
Readier: readier,
},
&gatewayv1alpha2.TCPRoute{}: &controller.TCPRouteReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindTCPRoute),
Provider: pro,
Updater: updater,
Readier: readier,
},
&gatewayv1alpha2.UDPRoute{}: &controller.UDPRouteReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindUDPRoute),
Provider: pro,
Updater: updater,
Readier: readier,
},
&gatewayv1.GRPCRoute{}: &controller.GRPCRouteReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGRPCRoute),
Provider: pro,
Updater: updater,
Readier: readier,
},
&v1alpha1.Consumer{}: &controller.ConsumerReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindConsumer),
Provider: pro,
Updater: updater,
Readier: readier,
},
} {
if utils.HasAPIResource(mgr, resource) {
controllers = append(controllers, controller)
} else {
setupLog.Info("Skipping controller setup, API not found in cluster", "api", utils.FormatGVK(resource))
}
}
} else {
setupLog.Info("Skipping Gateway API controllers setup as Gateway API is disabled")
}

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(types.KindGatewayClass),
Updater: updater,
},
&gatewayv1.Gateway{}: &controller.GatewayReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGateway),
Provider: pro,
Updater: updater,
},
&gatewayv1.HTTPRoute{}: &controller.HTTPRouteReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindHTTPRoute),
Provider: pro,
Updater: updater,
Readier: readier,
},
&gatewayv1alpha2.TCPRoute{}: &controller.TCPRouteReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindTCPRoute),
Provider: pro,
Updater: updater,
Readier: readier,
},
&gatewayv1alpha2.UDPRoute{}: &controller.UDPRouteReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindUDPRoute),
Provider: pro,
Updater: updater,
Readier: readier,
},
&gatewayv1.GRPCRoute{}: &controller.GRPCRouteReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGRPCRoute),
Provider: pro,
Updater: updater,
Readier: readier,
},
&v1alpha1.Consumer{}: &controller.ConsumerReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindConsumer),
Provider: pro,
Updater: updater,
Readier: readier,
},
&netv1.Ingress{}: &controller.IngressReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
Expand Down Expand Up @@ -270,8 +284,12 @@ func registerReadinessGVK(mgr manager.Manager, readier readiness.ReadinessManage
log := ctrl.LoggerFrom(context.Background()).WithName("readiness")

registerV2ForReadinessGVK(mgr, readier, log)
registerGatewayAPIForReadinessGVK(mgr, readier, log)
registerV1alpha1ForReadinessGVK(mgr, readier, log)
if !config.ControllerConfig.DisableGatewayAPI {
registerGatewayAPIForReadinessGVK(mgr, readier, log)
registerV1alpha1ForReadinessGVK(mgr, readier, log)
} else {
log.Info("Skipping Gateway API and v1alpha1 GVK registration for readiness checks as Gateway API is disabled")
}
}

func registerV2ForReadinessGVK(mgr manager.Manager, readier readiness.ReadinessManager, log logr.Logger) {
Expand Down
Loading