Skip to content

Commit 54f28ad

Browse files
authored
chore: indexer does not need to be set for each controller (#73)
1 parent b924d8a commit 54f28ad

File tree

5 files changed

+100
-57
lines changed

5 files changed

+100
-57
lines changed

internal/controller/gateway_controller.go

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,22 @@ type GatewayReconciler struct { //nolint:revive
3636
Provider provider.Provider
3737
}
3838

39-
func (r *GatewayReconciler) setupIndexer(mgr ctrl.Manager) error {
40-
if err := mgr.GetFieldIndexer().IndexField(
41-
context.Background(),
42-
&gatewayv1.Gateway{},
43-
indexer.ParametersRef,
44-
indexer.GatewayParametersRefIndexFunc,
45-
); err != nil {
46-
return err
47-
}
48-
return nil
49-
}
50-
5139
// SetupWithManager sets up the controller with the Manager.
5240
func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error {
53-
if err := r.setupIndexer(mgr); err != nil {
54-
return err
55-
}
5641
return ctrl.NewControllerManagedBy(mgr).
57-
For(&gatewayv1.Gateway{}).
42+
For(
43+
&gatewayv1.Gateway{},
44+
builder.WithPredicates(
45+
predicate.NewPredicateFuncs(r.checkGatewayClass),
46+
),
47+
).
5848
WithEventFilter(predicate.GenerationChangedPredicate{}).
5949
Watches(
6050
&gatewayv1.GatewayClass{},
6151
handler.EnqueueRequestsFromMapFunc(r.listGatewayForGatewayClass),
62-
builder.WithPredicates(predicate.NewPredicateFuncs(r.matchesGatewayClass)),
52+
builder.WithPredicates(
53+
predicate.NewPredicateFuncs(r.matchesGatewayClass),
54+
),
6355
).
6456
Watches(
6557
&gatewayv1.HTTPRoute{},
@@ -90,11 +82,6 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
9082
}
9183
return ctrl.Result{}, err
9284
}
93-
ns := gateway.GetNamespace()
94-
if !r.checkGatewayClass(gateway) {
95-
return ctrl.Result{}, nil
96-
}
97-
9885
conditionProgrammedStatus, conditionProgrammedMsg := true, "Programmed"
9986

10087
cfg := config.GetFirstGatewayConfig()
@@ -126,8 +113,8 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
126113
tctx := &provider.TranslateContext{
127114
Secrets: make(map[types.NamespacedName]*corev1.Secret),
128115
}
129-
r.processListenerConfig(tctx, gateway, ns)
130-
if err := r.processInfrastructure(tctx, gateway, ns); err != nil {
116+
r.processListenerConfig(tctx, gateway)
117+
if err := r.processInfrastructure(tctx, gateway); err != nil {
131118
acceptStatus = status{
132119
status: false,
133120
msg: err.Error(),
@@ -208,7 +195,8 @@ func (r *GatewayReconciler) listGatewayForGatewayClass(ctx context.Context, gate
208195
return reconcileGatewaysMatchGatewayClass(gatewayClass, gatewayList.Items)
209196
}
210197

211-
func (r *GatewayReconciler) checkGatewayClass(gateway *gatewayv1.Gateway) bool {
198+
func (r *GatewayReconciler) checkGatewayClass(obj client.Object) bool {
199+
gateway := obj.(*gatewayv1.Gateway)
212200
gatewayClass := &gatewayv1.GatewayClass{}
213201
if err := r.Client.Get(context.Background(), client.ObjectKey{Name: string(gateway.Spec.GatewayClassName)}, gatewayClass); err != nil {
214202
r.Log.Error(err, "failed to get gateway class", "gateway", gateway.GetName(), "gatewayclass", gateway.Spec.GatewayClassName)
@@ -281,12 +269,13 @@ func (r *GatewayReconciler) listGatewaysForHTTPRoute(_ context.Context, obj clie
281269
return recs
282270
}
283271

284-
func (r *GatewayReconciler) processInfrastructure(tctx *provider.TranslateContext, gateway *gatewayv1.Gateway, ns string) error {
272+
func (r *GatewayReconciler) processInfrastructure(tctx *provider.TranslateContext, gateway *gatewayv1.Gateway) error {
285273
infra := gateway.Spec.Infrastructure
286274
if infra == nil || infra.ParametersRef == nil {
287275
return nil
288276
}
289277

278+
ns := gateway.GetNamespace()
290279
paramRef := infra.ParametersRef
291280
if string(paramRef.Group) == v1alpha1.GroupVersion.Group && string(paramRef.Kind) == "GatewayProxy" {
292281
gatewayProxy := &v1alpha1.GatewayProxy{}
@@ -305,14 +294,15 @@ func (r *GatewayReconciler) processInfrastructure(tctx *provider.TranslateContex
305294
return nil
306295
}
307296

308-
func (r *GatewayReconciler) processListenerConfig(tctx *provider.TranslateContext, gateway *gatewayv1.Gateway, ns string) {
297+
func (r *GatewayReconciler) processListenerConfig(tctx *provider.TranslateContext, gateway *gatewayv1.Gateway) {
309298
listeners := gateway.Spec.Listeners
310299
for _, listener := range listeners {
311300
if listener.TLS == nil || listener.TLS.CertificateRefs == nil {
312301
continue
313302
}
314303
secret := corev1.Secret{}
315304
for _, ref := range listener.TLS.CertificateRefs {
305+
ns := gateway.GetNamespace()
316306
if ref.Namespace != nil {
317307
ns = string(*ref.Namespace)
318308
}

internal/controller/httproute_controller.go

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,6 @@ type HTTPRouteReconciler struct { //nolint:revive
3838

3939
// SetupWithManager sets up the controller with the Manager.
4040
func (r *HTTPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
41-
if err := r.setupIndexer(mgr); err != nil {
42-
return err
43-
}
4441
return ctrl.NewControllerManagedBy(mgr).
4542
For(&gatewayv1.HTTPRoute{}).
4643
WithEventFilter(predicate.GenerationChangedPredicate{}).
@@ -137,27 +134,6 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
137134
return ctrl.Result{}, nil
138135
}
139136

140-
// SetupWithManager sets up the controller with the Manager.
141-
func (r *HTTPRouteReconciler) setupIndexer(mgr ctrl.Manager) error {
142-
if err := mgr.GetFieldIndexer().IndexField(
143-
context.Background(),
144-
&gatewayv1.HTTPRoute{},
145-
indexer.ExtensionRef,
146-
indexer.HTTPRouteExtensionIndexFunc,
147-
); err != nil {
148-
return err
149-
}
150-
if err := mgr.GetFieldIndexer().IndexField(
151-
context.Background(),
152-
&gatewayv1.HTTPRoute{},
153-
indexer.ServiceIndexRef,
154-
indexer.HTTPRouteServiceIndexFunc,
155-
); err != nil {
156-
return err
157-
}
158-
return nil
159-
}
160-
161137
func (r *HTTPRouteReconciler) listHTTPRoutesByServiceBef(ctx context.Context, obj client.Object) []reconcile.Request {
162138
endpointSlice, ok := obj.(*discoveryv1.EndpointSlice)
163139
if !ok {

internal/controller/indexer/indexer.go

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,95 @@
11
package indexer
22

33
import (
4+
"context"
5+
6+
ctrl "sigs.k8s.io/controller-runtime"
47
"sigs.k8s.io/controller-runtime/pkg/client"
58
gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
69
)
710

811
const (
9-
ServiceIndexRef = "serviceRef"
12+
ServiceIndexRef = "serviceRefs"
1013
ExtensionRef = "extensionRef"
1114
ParametersRef = "parametersRef"
15+
ParentRefs = "parentRefs"
1216
)
1317

18+
func SetupIndexer(mgr ctrl.Manager) error {
19+
if err := setupGatewayIndexer(mgr); err != nil {
20+
return err
21+
}
22+
if err := setupHTTPRouteIndexer(mgr); err != nil {
23+
return err
24+
}
25+
return nil
26+
}
27+
28+
func setupGatewayIndexer(mgr ctrl.Manager) error {
29+
if err := mgr.GetFieldIndexer().IndexField(
30+
context.Background(),
31+
&gatewayv1.Gateway{},
32+
ParametersRef,
33+
GatewayParametersRefIndexFunc,
34+
); err != nil {
35+
return err
36+
}
37+
return nil
38+
}
39+
40+
func setupHTTPRouteIndexer(mgr ctrl.Manager) error {
41+
if err := mgr.GetFieldIndexer().IndexField(
42+
context.Background(),
43+
&gatewayv1.HTTPRoute{},
44+
ParentRefs,
45+
HTTPRouteParentRefsIndexFunc,
46+
); err != nil {
47+
return err
48+
}
49+
50+
if err := mgr.GetFieldIndexer().IndexField(
51+
context.Background(),
52+
&gatewayv1.HTTPRoute{},
53+
ExtensionRef,
54+
HTTPRouteExtensionIndexFunc,
55+
); err != nil {
56+
return err
57+
}
58+
59+
if err := mgr.GetFieldIndexer().IndexField(
60+
context.Background(),
61+
&gatewayv1.HTTPRoute{},
62+
ServiceIndexRef,
63+
HTTPRouteServiceIndexFunc,
64+
); err != nil {
65+
return err
66+
}
67+
return nil
68+
}
69+
1470
func GenIndexKey(namespace, name string) string {
1571
return client.ObjectKey{
1672
Namespace: namespace,
1773
Name: name,
1874
}.String()
1975
}
2076

77+
func HTTPRouteParentRefsIndexFunc(rawObj client.Object) []string {
78+
hr := rawObj.(*gatewayv1.HTTPRoute)
79+
keys := make([]string, 0, len(hr.Spec.ParentRefs))
80+
for _, ref := range hr.Spec.ParentRefs {
81+
ns := hr.GetNamespace()
82+
if ref.Namespace != nil {
83+
ns = string(*ref.Namespace)
84+
}
85+
keys = append(keys, GenIndexKey(ns, string(ref.Name)))
86+
}
87+
return keys
88+
}
89+
2190
func HTTPRouteServiceIndexFunc(rawObj client.Object) []string {
2291
hr := rawObj.(*gatewayv1.HTTPRoute)
23-
var keys []string
92+
keys := make([]string, 0, len(hr.Spec.Rules))
2493
for _, rule := range hr.Spec.Rules {
2594
for _, backend := range rule.BackendRefs {
2695
namespace := hr.GetNamespace()
@@ -38,7 +107,7 @@ func HTTPRouteServiceIndexFunc(rawObj client.Object) []string {
38107

39108
func HTTPRouteExtensionIndexFunc(rawObj client.Object) []string {
40109
hr := rawObj.(*gatewayv1.HTTPRoute)
41-
var keys []string
110+
keys := make([]string, 0, len(hr.Spec.Rules))
42111
for _, rule := range hr.Spec.Rules {
43112
for _, filter := range rule.Filters {
44113
if filter.Type != gatewayv1.HTTPRouteFilterExtensionRef || filter.ExtensionRef == nil {

internal/manager/controllers.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"sigs.k8s.io/controller-runtime/pkg/manager"
88

99
"github.com/api7/api7-ingress-controller/internal/controller"
10+
"github.com/api7/api7-ingress-controller/internal/controller/indexer"
1011
"github.com/api7/api7-ingress-controller/internal/provider"
1112
)
1213

@@ -23,7 +24,10 @@ type Controller interface {
2324
SetupWithManager(mgr manager.Manager) error
2425
}
2526

26-
func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Provider) []Controller {
27+
func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Provider) ([]Controller, error) {
28+
if err := indexer.SetupIndexer(mgr); err != nil {
29+
return nil, err
30+
}
2731
return []Controller{
2832
&controller.GatewayClassReconciler{
2933
Client: mgr.GetClient(),
@@ -42,5 +46,5 @@ func setupControllers(ctx context.Context, mgr manager.Manager, pro provider.Pro
4246
Log: ctrl.LoggerFrom(ctx).WithName("controllers").WithName("HTTPRoute"),
4347
Provider: pro,
4448
},
45-
}
49+
}, nil
4650
}

internal/manager/run.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,11 @@ func Run(ctx context.Context, logger logr.Logger) error {
124124
}
125125

126126
setupLog.Info("setting up controllers")
127-
controllers := setupControllers(ctx, mgr, pro)
127+
controllers, err := setupControllers(ctx, mgr, pro)
128+
if err != nil {
129+
setupLog.Error(err, "unable to set up controllers")
130+
return err
131+
}
128132
for _, c := range controllers {
129133
if err := c.SetupWithManager(mgr); err != nil {
130134
return err

0 commit comments

Comments
 (0)