Skip to content

Commit b44edd6

Browse files
committed
fix: review
Signed-off-by: ashing <[email protected]>
1 parent 73c4d9e commit b44edd6

File tree

3 files changed

+116
-23
lines changed

3 files changed

+116
-23
lines changed

internal/controller/indexer/indexer.go

Lines changed: 61 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ func SetupIndexer(mgr ctrl.Manager) error {
4242
if err := setupBackendTrafficPolicyIndexer(mgr); err != nil {
4343
return err
4444
}
45+
if err := setupIngressClassIndexer(mgr); err != nil {
46+
return err
47+
}
48+
if err := setupGatewayProxyIndexer(mgr); err != nil {
49+
return err
50+
}
4551
return nil
4652
}
4753

@@ -149,53 +155,90 @@ func setupHTTPRouteIndexer(mgr ctrl.Manager) error {
149155
return nil
150156
}
151157

152-
func setupIngressIndexer(mgr ctrl.Manager) error {
158+
func setupIngressClassIndexer(mgr ctrl.Manager) error {
153159
// create IngressClass index
154160
if err := mgr.GetFieldIndexer().IndexField(
155161
context.Background(),
156-
&networkingv1.Ingress{},
157-
IngressClassRef,
158-
IngressClassRefIndexFunc,
162+
&networkingv1.IngressClass{},
163+
IngressClass,
164+
IngressClassIndexFunc,
159165
); err != nil {
160166
return err
161167
}
162168

163-
// create Service index for quick lookup of Ingresses using specific services
169+
// create IngressClassParametersRef index
164170
if err := mgr.GetFieldIndexer().IndexField(
165171
context.Background(),
166-
&networkingv1.Ingress{},
167-
ServiceIndexRef,
168-
IngressServiceIndexFunc,
172+
&networkingv1.IngressClass{},
173+
IngressClassParametersRef,
174+
IngressClassParametersRefIndexFunc,
169175
); err != nil {
170176
return err
171177
}
172178

173-
// create secret index for TLS
179+
return nil
180+
}
181+
182+
func setupGatewayProxyIndexer(mgr ctrl.Manager) error {
174183
if err := mgr.GetFieldIndexer().IndexField(
175184
context.Background(),
176-
&networkingv1.Ingress{},
185+
&v1alpha1.GatewayProxy{},
177186
SecretIndexRef,
178-
IngressSecretIndexFunc,
187+
GatewayProxySecretIndexFunc,
179188
); err != nil {
180189
return err
181190
}
191+
return nil
192+
}
182193

194+
func GatewayProxySecretIndexFunc(rawObj client.Object) []string {
195+
gatewayProxy := rawObj.(*v1alpha1.GatewayProxy)
196+
secretKeys := make([]string, 0)
197+
198+
// Check if provider is ControlPlane type and has AdminKey auth
199+
if gatewayProxy.Spec.Provider != nil &&
200+
gatewayProxy.Spec.Provider.Type == v1alpha1.ProviderTypeControlPlane &&
201+
gatewayProxy.Spec.Provider.ControlPlane != nil &&
202+
gatewayProxy.Spec.Provider.ControlPlane.Auth.Type == v1alpha1.AuthTypeAdminKey &&
203+
gatewayProxy.Spec.Provider.ControlPlane.Auth.AdminKey != nil &&
204+
gatewayProxy.Spec.Provider.ControlPlane.Auth.AdminKey.ValueFrom != nil &&
205+
gatewayProxy.Spec.Provider.ControlPlane.Auth.AdminKey.ValueFrom.SecretKeyRef != nil {
206+
207+
ref := gatewayProxy.Spec.Provider.ControlPlane.Auth.AdminKey.ValueFrom.SecretKeyRef
208+
ns := gatewayProxy.GetNamespace()
209+
key := GenIndexKey(ns, ref.Name)
210+
secretKeys = append(secretKeys, key)
211+
}
212+
return secretKeys
213+
}
214+
215+
func setupIngressIndexer(mgr ctrl.Manager) error {
183216
// create IngressClass index
184217
if err := mgr.GetFieldIndexer().IndexField(
185218
context.Background(),
186-
&networkingv1.IngressClass{},
187-
IngressClass,
188-
IngressClassIndexFunc,
219+
&networkingv1.Ingress{},
220+
IngressClassRef,
221+
IngressClassRefIndexFunc,
189222
); err != nil {
190223
return err
191224
}
192225

193-
// create IngressClassParametersRef index
226+
// create Service index for quick lookup of Ingresses using specific services
194227
if err := mgr.GetFieldIndexer().IndexField(
195228
context.Background(),
196-
&networkingv1.IngressClass{},
197-
IngressClassParametersRef,
198-
IngressClassParametersRefIndexFunc,
229+
&networkingv1.Ingress{},
230+
ServiceIndexRef,
231+
IngressServiceIndexFunc,
232+
); err != nil {
233+
return err
234+
}
235+
236+
// create secret index for TLS
237+
if err := mgr.GetFieldIndexer().IndexField(
238+
context.Background(),
239+
&networkingv1.Ingress{},
240+
SecretIndexRef,
241+
IngressSecretIndexFunc,
199242
); err != nil {
200243
return err
201244
}

internal/controller/ingressclass_controller.go

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@ import (
44
"context"
55
"fmt"
66

7-
"github.com/api7/api7-ingress-controller/api/v1alpha1"
8-
"github.com/api7/api7-ingress-controller/internal/controller/indexer"
9-
"github.com/api7/api7-ingress-controller/internal/provider"
107
"github.com/api7/gopkg/pkg/log"
118
"github.com/go-logr/logr"
129
corev1 "k8s.io/api/core/v1"
@@ -19,6 +16,10 @@ import (
1916
"sigs.k8s.io/controller-runtime/pkg/handler"
2017
"sigs.k8s.io/controller-runtime/pkg/predicate"
2118
"sigs.k8s.io/controller-runtime/pkg/reconcile"
19+
20+
"github.com/api7/api7-ingress-controller/api/v1alpha1"
21+
"github.com/api7/api7-ingress-controller/internal/controller/indexer"
22+
"github.com/api7/api7-ingress-controller/internal/provider"
2223
)
2324

2425
// IngressClassReconciler reconciles a IngressClass object.
@@ -44,6 +45,10 @@ func (r *IngressClassReconciler) SetupWithManager(mgr ctrl.Manager) error {
4445
&v1alpha1.GatewayProxy{},
4546
handler.EnqueueRequestsFromMapFunc(r.listIngressClassesForGatewayProxy),
4647
).
48+
Watches(
49+
&corev1.Secret{},
50+
handler.EnqueueRequestsFromMapFunc(r.listIngressClassesForSecret),
51+
).
4752
Complete(r)
4853
}
4954

@@ -122,6 +127,50 @@ func (r *IngressClassReconciler) listIngressClassesForGatewayProxy(ctx context.C
122127
return recs
123128
}
124129

130+
func (r *IngressClassReconciler) listIngressClassesForSecret(ctx context.Context, obj client.Object) []reconcile.Request {
131+
secret, ok := obj.(*corev1.Secret)
132+
if !ok {
133+
r.Log.Error(fmt.Errorf("unexpected object type"), "failed to convert object to Secret")
134+
return nil
135+
}
136+
137+
// 1. list gateway proxies by secret
138+
gatewayProxyList := &v1alpha1.GatewayProxyList{}
139+
if err := r.List(ctx, gatewayProxyList, client.MatchingFields{
140+
indexer.SecretIndexRef: indexer.GenIndexKey(secret.GetNamespace(), secret.GetName()),
141+
}); err != nil {
142+
r.Log.Error(err, "failed to list gateway proxies by secret", "secret", secret.GetName())
143+
return nil
144+
}
145+
146+
// 2. list ingress classes by gateway proxies
147+
requests := make([]reconcile.Request, 0)
148+
for _, gatewayProxy := range gatewayProxyList.Items {
149+
ingressClassList := &networkingv1.IngressClassList{}
150+
if err := r.List(ctx, ingressClassList, client.MatchingFields{
151+
indexer.IngressClassParametersRef: indexer.GenIndexKey(gatewayProxy.GetNamespace(), gatewayProxy.GetName()),
152+
}); err != nil {
153+
r.Log.Error(err, "failed to list ingress classes by secret", "secret", secret.GetName())
154+
return nil
155+
}
156+
for _, ingressClass := range ingressClassList.Items {
157+
if !r.matchesController(&ingressClass) {
158+
continue
159+
}
160+
requests = append(requests, reconcile.Request{
161+
NamespacedName: client.ObjectKey{
162+
Name: ingressClass.GetName(),
163+
Namespace: ingressClass.GetNamespace(),
164+
},
165+
})
166+
}
167+
}
168+
169+
requests = distinctRequests(requests)
170+
171+
return requests
172+
}
173+
125174
func (r *IngressClassReconciler) processInfrastructure(tctx *provider.TranslateContext, ingressClass *networkingv1.IngressClass) error {
126175
if ingressClass.Spec.Parameters == nil {
127176
return nil

internal/provider/adc/translator/ingressclass.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package translator
22

33
import (
4-
adctypes "github.com/api7/api7-ingress-controller/api/adc"
5-
"github.com/api7/api7-ingress-controller/internal/provider"
64
"github.com/api7/gopkg/pkg/log"
75
"go.uber.org/zap"
86
networkingv1 "k8s.io/api/networking/v1"
7+
8+
adctypes "github.com/api7/api7-ingress-controller/api/adc"
9+
"github.com/api7/api7-ingress-controller/internal/provider"
910
)
1011

1112
func (t *Translator) TranslateIngressClass(tctx *provider.TranslateContext, obj *networkingv1.IngressClass) (*TranslateResult, error) {

0 commit comments

Comments
 (0)