Skip to content

Commit 251c0c6

Browse files
authored
feat: support disable gateway api (#342)
1 parent e699a73 commit 251c0c6

File tree

5 files changed

+160
-93
lines changed

5 files changed

+160
-93
lines changed

config/samples/config.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ secure_metrics: false # The secure metrics configuration.
3333
exec_adc_timeout: 15s # The timeout for the ADC to execute.
3434
# The default value is 15 seconds.
3535

36+
disable_gateway_api: false # Whether to disable the Gateway API support.
37+
# The default value is false.
38+
3639
provider:
3740
type: "api7ee"
3841

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package config
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestNewDefaultConfig(t *testing.T) {
11+
cfg := NewDefaultConfig()
12+
assert.NotNil(t, cfg)
13+
assert.Equal(t, DefaultLogLevel, cfg.LogLevel)
14+
assert.Equal(t, DefaultControllerName, cfg.ControllerName)
15+
assert.Equal(t, DefaultLeaderElectionID, cfg.LeaderElectionID)
16+
}
17+
18+
func TestNewConfigFromFile(t *testing.T) {
19+
// Create a temporary config file
20+
fileContent := `
21+
log_level: debug
22+
controller_name: test-controller
23+
disable_gateway_api: true
24+
`
25+
tempFile, err := os.CreateTemp("", "config-*.yaml")
26+
assert.NoError(t, err)
27+
defer func() {
28+
_ = os.Remove(tempFile.Name())
29+
}()
30+
31+
_, err = tempFile.WriteString(fileContent)
32+
assert.NoError(t, err)
33+
_ = tempFile.Close()
34+
35+
cfg, err := NewConfigFromFile(tempFile.Name())
36+
assert.NoError(t, err)
37+
assert.Equal(t, "debug", cfg.LogLevel)
38+
assert.Equal(t, "test-controller", cfg.ControllerName)
39+
assert.Equal(t, true, cfg.DisableGatewayAPI)
40+
}

internal/controller/config/types.go

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,20 @@ const (
5656
// Config contains all config items which are necessary for
5757
// apisix-ingress-controller's running.
5858
type Config struct {
59-
LogLevel string `json:"log_level" yaml:"log_level"`
60-
ControllerName string `json:"controller_name" yaml:"controller_name"`
61-
LeaderElectionID string `json:"leader_election_id" yaml:"leader_election_id"`
62-
MetricsAddr string `json:"metrics_addr" yaml:"metrics_addr"`
63-
ServerAddr string `json:"server_addr" yaml:"server_addr"`
64-
EnableServer bool `json:"enable_server" yaml:"enable_server"`
65-
EnableHTTP2 bool `json:"enable_http2" yaml:"enable_http2"`
66-
ProbeAddr string `json:"probe_addr" yaml:"probe_addr"`
67-
SecureMetrics bool `json:"secure_metrics" yaml:"secure_metrics"`
68-
LeaderElection *LeaderElection `json:"leader_election" yaml:"leader_election"`
69-
ExecADCTimeout types.TimeDuration `json:"exec_adc_timeout" yaml:"exec_adc_timeout"`
70-
ProviderConfig ProviderConfig `json:"provider" yaml:"provider"`
71-
Webhook *WebhookConfig `json:"webhook" yaml:"webhook"`
59+
LogLevel string `json:"log_level" yaml:"log_level"`
60+
ControllerName string `json:"controller_name" yaml:"controller_name"`
61+
LeaderElectionID string `json:"leader_election_id" yaml:"leader_election_id"`
62+
MetricsAddr string `json:"metrics_addr" yaml:"metrics_addr"`
63+
ServerAddr string `json:"server_addr" yaml:"server_addr"`
64+
EnableServer bool `json:"enable_server" yaml:"enable_server"`
65+
EnableHTTP2 bool `json:"enable_http2" yaml:"enable_http2"`
66+
ProbeAddr string `json:"probe_addr" yaml:"probe_addr"`
67+
SecureMetrics bool `json:"secure_metrics" yaml:"secure_metrics"`
68+
LeaderElection *LeaderElection `json:"leader_election" yaml:"leader_election"`
69+
ExecADCTimeout types.TimeDuration `json:"exec_adc_timeout" yaml:"exec_adc_timeout"`
70+
ProviderConfig ProviderConfig `json:"provider" yaml:"provider"`
71+
Webhook *WebhookConfig `json:"webhook" yaml:"webhook"`
72+
DisableGatewayAPI bool `json:"disable_gateway_api" yaml:"disable_gateway_api"`
7273
}
7374

7475
type GatewayConfig struct {

internal/controller/indexer/indexer.go

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333

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

6162
// Gateway API indexers - conditional setup based on API availability
63+
if !config.ControllerConfig.DisableGatewayAPI {
64+
for resource, setup := range map[client.Object]func(ctrl.Manager) error{
65+
&gatewayv1.Gateway{}: setupGatewayIndexer,
66+
&gatewayv1.HTTPRoute{}: setupHTTPRouteIndexer,
67+
&gatewayv1.GRPCRoute{}: setupGRPCRouteIndexer,
68+
&gatewayv1alpha2.TCPRoute{}: setupTCPRouteIndexer,
69+
&gatewayv1alpha2.UDPRoute{}: setupUDPRouteIndexer,
70+
&gatewayv1.GatewayClass{}: setupGatewayClassIndexer,
71+
&v1alpha1.Consumer{}: setupConsumerIndexer,
72+
} {
73+
if utils.HasAPIResource(mgr, resource) {
74+
if err := setup(mgr); err != nil {
75+
return err
76+
}
77+
} else {
78+
setupLog.Info("Skipping indexer setup, API not found in cluster", "api", utils.FormatGVK(resource))
79+
}
80+
}
81+
}
82+
6283
for resource, setup := range map[client.Object]func(ctrl.Manager) error{
63-
&gatewayv1.Gateway{}: setupGatewayIndexer,
64-
&gatewayv1.HTTPRoute{}: setupHTTPRouteIndexer,
65-
&gatewayv1.GRPCRoute{}: setupGRPCRouteIndexer,
66-
&gatewayv1alpha2.TCPRoute{}: setupTCPRouteIndexer,
67-
&gatewayv1alpha2.UDPRoute{}: setupUDPRouteIndexer,
68-
&gatewayv1.GatewayClass{}: setupGatewayClassIndexer,
69-
&v1alpha1.Consumer{}: setupConsumerIndexer,
7084
&networkingv1.Ingress{}: setupIngressIndexer,
7185
&networkingv1.IngressClass{}: setupIngressClassIndexer,
7286
&networkingv1beta1.IngressClass{}: setupIngressClassV1beta1Indexer,
@@ -81,15 +95,6 @@ func SetupIndexer(mgr ctrl.Manager) error {
8195
}
8296
}
8397

84-
// Gateway secret index needs conditional setup since it uses Gateway API
85-
if utils.HasAPIResource(mgr, &gatewayv1.Gateway{}) {
86-
if err := setupGatewaySecretIndex(mgr); err != nil {
87-
return err
88-
}
89-
} else {
90-
setupLog.Info("Skipping indexer setup, API not found in cluster", "api", utils.FormatGVK(&gatewayv1.Gateway{}))
91-
}
92-
9398
// Core Kubernetes and APISIX indexers - always setup these
9499
for _, setup := range []func(ctrl.Manager) error{
95100
setupGatewayProxyIndexer,
@@ -125,6 +130,15 @@ func setupGatewayIndexer(mgr ctrl.Manager) error {
125130
); err != nil {
126131
return err
127132
}
133+
134+
if err := mgr.GetFieldIndexer().IndexField(
135+
context.Background(),
136+
&gatewayv1.Gateway{},
137+
SecretIndexRef,
138+
GatewaySecretIndexFunc,
139+
); err != nil {
140+
return err
141+
}
128142
return nil
129143
}
130144

@@ -371,15 +385,6 @@ func setupGatewayProxyIndexer(mgr ctrl.Manager) error {
371385
return nil
372386
}
373387

374-
func setupGatewaySecretIndex(mgr ctrl.Manager) error {
375-
return mgr.GetFieldIndexer().IndexField(
376-
context.Background(),
377-
&gatewayv1.Gateway{},
378-
SecretIndexRef,
379-
GatewaySecretIndexFunc,
380-
)
381-
}
382-
383388
func setupGatewayClassIndexer(mgr ctrl.Manager) error {
384389
return mgr.GetFieldIndexer().IndexField(
385390
context.Background(),

internal/manager/controllers.go

Lines changed: 73 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"github.com/apache/apisix-ingress-controller/api/v1alpha1"
3636
apiv2 "github.com/apache/apisix-ingress-controller/api/v2"
3737
"github.com/apache/apisix-ingress-controller/internal/controller"
38+
"github.com/apache/apisix-ingress-controller/internal/controller/config"
3839
"github.com/apache/apisix-ingress-controller/internal/controller/indexer"
3940
"github.com/apache/apisix-ingress-controller/internal/controller/status"
4041
"github.com/apache/apisix-ingress-controller/internal/manager/readiness"
@@ -125,60 +126,73 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro
125126
}
126127

127128
// Gateway API Controllers - conditional registration based on API availability
129+
if !config.ControllerConfig.DisableGatewayAPI {
130+
for resource, controller := range map[client.Object]Controller{
131+
&gatewayv1.GatewayClass{}: &controller.GatewayClassReconciler{
132+
Client: mgr.GetClient(),
133+
Scheme: mgr.GetScheme(),
134+
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGatewayClass),
135+
Updater: updater,
136+
},
137+
&gatewayv1.Gateway{}: &controller.GatewayReconciler{
138+
Client: mgr.GetClient(),
139+
Scheme: mgr.GetScheme(),
140+
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGateway),
141+
Provider: pro,
142+
Updater: updater,
143+
},
144+
&gatewayv1.HTTPRoute{}: &controller.HTTPRouteReconciler{
145+
Client: mgr.GetClient(),
146+
Scheme: mgr.GetScheme(),
147+
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindHTTPRoute),
148+
Provider: pro,
149+
Updater: updater,
150+
Readier: readier,
151+
},
152+
&gatewayv1alpha2.TCPRoute{}: &controller.TCPRouteReconciler{
153+
Client: mgr.GetClient(),
154+
Scheme: mgr.GetScheme(),
155+
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindTCPRoute),
156+
Provider: pro,
157+
Updater: updater,
158+
Readier: readier,
159+
},
160+
&gatewayv1alpha2.UDPRoute{}: &controller.UDPRouteReconciler{
161+
Client: mgr.GetClient(),
162+
Scheme: mgr.GetScheme(),
163+
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindUDPRoute),
164+
Provider: pro,
165+
Updater: updater,
166+
Readier: readier,
167+
},
168+
&gatewayv1.GRPCRoute{}: &controller.GRPCRouteReconciler{
169+
Client: mgr.GetClient(),
170+
Scheme: mgr.GetScheme(),
171+
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGRPCRoute),
172+
Provider: pro,
173+
Updater: updater,
174+
Readier: readier,
175+
},
176+
&v1alpha1.Consumer{}: &controller.ConsumerReconciler{
177+
Client: mgr.GetClient(),
178+
Scheme: mgr.GetScheme(),
179+
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindConsumer),
180+
Provider: pro,
181+
Updater: updater,
182+
Readier: readier,
183+
},
184+
} {
185+
if utils.HasAPIResource(mgr, resource) {
186+
controllers = append(controllers, controller)
187+
} else {
188+
setupLog.Info("Skipping controller setup, API not found in cluster", "api", utils.FormatGVK(resource))
189+
}
190+
}
191+
} else {
192+
setupLog.Info("Skipping Gateway API controllers setup as Gateway API is disabled")
193+
}
194+
128195
for resource, controller := range map[client.Object]Controller{
129-
&gatewayv1.GatewayClass{}: &controller.GatewayClassReconciler{
130-
Client: mgr.GetClient(),
131-
Scheme: mgr.GetScheme(),
132-
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGatewayClass),
133-
Updater: updater,
134-
},
135-
&gatewayv1.Gateway{}: &controller.GatewayReconciler{
136-
Client: mgr.GetClient(),
137-
Scheme: mgr.GetScheme(),
138-
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGateway),
139-
Provider: pro,
140-
Updater: updater,
141-
},
142-
&gatewayv1.HTTPRoute{}: &controller.HTTPRouteReconciler{
143-
Client: mgr.GetClient(),
144-
Scheme: mgr.GetScheme(),
145-
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindHTTPRoute),
146-
Provider: pro,
147-
Updater: updater,
148-
Readier: readier,
149-
},
150-
&gatewayv1alpha2.TCPRoute{}: &controller.TCPRouteReconciler{
151-
Client: mgr.GetClient(),
152-
Scheme: mgr.GetScheme(),
153-
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindTCPRoute),
154-
Provider: pro,
155-
Updater: updater,
156-
Readier: readier,
157-
},
158-
&gatewayv1alpha2.UDPRoute{}: &controller.UDPRouteReconciler{
159-
Client: mgr.GetClient(),
160-
Scheme: mgr.GetScheme(),
161-
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindUDPRoute),
162-
Provider: pro,
163-
Updater: updater,
164-
Readier: readier,
165-
},
166-
&gatewayv1.GRPCRoute{}: &controller.GRPCRouteReconciler{
167-
Client: mgr.GetClient(),
168-
Scheme: mgr.GetScheme(),
169-
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindGRPCRoute),
170-
Provider: pro,
171-
Updater: updater,
172-
Readier: readier,
173-
},
174-
&v1alpha1.Consumer{}: &controller.ConsumerReconciler{
175-
Client: mgr.GetClient(),
176-
Scheme: mgr.GetScheme(),
177-
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName(types.KindConsumer),
178-
Provider: pro,
179-
Updater: updater,
180-
Readier: readier,
181-
},
182196
&netv1.Ingress{}: &controller.IngressReconciler{
183197
Client: mgr.GetClient(),
184198
Scheme: mgr.GetScheme(),
@@ -270,8 +284,12 @@ func registerReadinessGVK(mgr manager.Manager, readier readiness.ReadinessManage
270284
log := ctrl.LoggerFrom(context.Background()).WithName("readiness")
271285

272286
registerV2ForReadinessGVK(mgr, readier, log)
273-
registerGatewayAPIForReadinessGVK(mgr, readier, log)
274-
registerV1alpha1ForReadinessGVK(mgr, readier, log)
287+
if !config.ControllerConfig.DisableGatewayAPI {
288+
registerGatewayAPIForReadinessGVK(mgr, readier, log)
289+
registerV1alpha1ForReadinessGVK(mgr, readier, log)
290+
} else {
291+
log.Info("Skipping Gateway API and v1alpha1 GVK registration for readiness checks as Gateway API is disabled")
292+
}
275293
}
276294

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

0 commit comments

Comments
 (0)