Skip to content

Commit 6866ce9

Browse files
ronethingAlinsRan
andauthored
backport: part 7 (#252)
Signed-off-by: Ashing Zheng <[email protected]> Co-authored-by: AlinsRan <[email protected]>
1 parent 5944009 commit 6866ce9

14 files changed

+312
-79
lines changed

internal/controller/apisixconsumer_controller.go

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (r *ApisixConsumerReconciler) Reconcile(ctx context.Context, req ctrl.Reque
9090
err error
9191
)
9292

93-
if ingressClass, err = GetIngressClass(tctx, r.Client, r.Log, ac.Spec.IngressClassName, r.ICGV.String()); err != nil {
93+
if ingressClass, err = FindMatchingIngressClassByObject(tctx, r.Client, r.Log, ac, r.ICGV.String()); err != nil {
9494
r.Log.V(1).Info("no matching IngressClass available",
9595
"ingressClassName", ac.Spec.IngressClassName,
9696
"error", err.Error())
@@ -100,12 +100,12 @@ func (r *ApisixConsumerReconciler) Reconcile(ctx context.Context, req ctrl.Reque
100100

101101
if err = ProcessIngressClassParameters(tctx, r.Client, r.Log, ac, ingressClass); err != nil {
102102
r.Log.Error(err, "failed to process IngressClass parameters", "ingressClass", ingressClass.Name)
103-
return ctrl.Result{}, err
103+
return ctrl.Result{}, client.IgnoreNotFound(err)
104104
}
105105

106106
if err = r.processSpec(ctx, tctx, ac); err != nil {
107107
r.Log.Error(err, "failed to process ApisixConsumer spec", "object", ac)
108-
return ctrl.Result{}, err
108+
return ctrl.Result{}, client.IgnoreNotFound(err)
109109
}
110110

111111
if err = r.Provider.Update(ctx, tctx, ac); err != nil {
@@ -128,7 +128,7 @@ func (r *ApisixConsumerReconciler) SetupWithManager(mgr ctrl.Manager) error {
128128
return ctrl.NewControllerManagedBy(mgr).
129129
For(&apiv2.ApisixConsumer{},
130130
builder.WithPredicates(
131-
predicate.NewPredicateFuncs(r.checkIngressClass),
131+
MatchesIngressClassPredicate(r.Client, r.Log, r.ICGV.String()),
132132
)).
133133
WithEventFilter(
134134
predicate.Or(
@@ -154,15 +154,6 @@ func (r *ApisixConsumerReconciler) SetupWithManager(mgr ctrl.Manager) error {
154154
Complete(r)
155155
}
156156

157-
func (r *ApisixConsumerReconciler) checkIngressClass(obj client.Object) bool {
158-
ac, ok := obj.(*apiv2.ApisixConsumer)
159-
if !ok {
160-
return false
161-
}
162-
163-
return matchesIngressClass(context.Background(), r.Client, r.Log, ac.Spec.IngressClassName, r.ICGV.String())
164-
}
165-
166157
func (r *ApisixConsumerReconciler) listApisixConsumerForGatewayProxy(ctx context.Context, obj client.Object) []reconcile.Request {
167158
switch r.ICGV.String() {
168159
case networkingv1beta1.SchemeGroupVersion.String():

internal/controller/apisixglobalrule_controller.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,15 @@ func (r *ApisixGlobalRuleReconciler) Reconcile(ctx context.Context, req ctrl.Req
8787
tctx := provider.NewDefaultTranslateContext(ctx)
8888

8989
// get the ingress class
90-
ingressClass, err := GetIngressClass(tctx, r.Client, r.Log, globalRule.Spec.IngressClassName, r.ICGV.String())
90+
ingressClass, err := FindMatchingIngressClassByObject(tctx, r.Client, r.Log, &globalRule, r.ICGV.String())
9191
if err != nil {
9292
r.Log.V(1).Info("no matching IngressClass available",
9393
"ingressClassName", globalRule.Spec.IngressClassName,
9494
"error", err.Error())
95+
if err := r.Provider.Delete(ctx, &globalRule); err != nil {
96+
r.Log.Error(err, "failed to delete global rule from provider")
97+
return ctrl.Result{}, err
98+
}
9599
return ctrl.Result{}, nil
96100
}
97101

@@ -140,7 +144,7 @@ func (r *ApisixGlobalRuleReconciler) SetupWithManager(mgr ctrl.Manager) error {
140144
return ctrl.NewControllerManagedBy(mgr).
141145
For(&apiv2.ApisixGlobalRule{},
142146
builder.WithPredicates(
143-
predicate.NewPredicateFuncs(r.checkIngressClass),
147+
MatchesIngressClassPredicate(r.Client, r.Log, r.ICGV.String()),
144148
),
145149
).
146150
WithEventFilter(
@@ -163,16 +167,6 @@ func (r *ApisixGlobalRuleReconciler) SetupWithManager(mgr ctrl.Manager) error {
163167
Complete(r)
164168
}
165169

166-
// checkIngressClass checks if the ApisixGlobalRule uses the ingress class that we control
167-
func (r *ApisixGlobalRuleReconciler) checkIngressClass(obj client.Object) bool {
168-
globalRule, ok := obj.(*apiv2.ApisixGlobalRule)
169-
if !ok {
170-
return false
171-
}
172-
173-
return matchesIngressClass(context.Background(), r.Client, r.Log, globalRule.Spec.IngressClassName, r.ICGV.String())
174-
}
175-
176170
// listGlobalRulesForIngressClass list all global rules that use a specific ingress class
177171
func (r *ApisixGlobalRuleReconciler) listGlobalRulesForIngressClass(ctx context.Context, obj client.Object) []reconcile.Request {
178172
ingressClass := pkgutils.ConvertToIngressClassV1(obj)

internal/controller/apisixpluginconfig_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func (r *ApisixPluginConfigReconciler) Reconcile(ctx context.Context, req ctrl.R
6060
}
6161
tctx := provider.NewDefaultTranslateContext(ctx)
6262

63-
_, err := GetIngressClass(tctx, r.Client, r.Log, pc.Spec.IngressClassName, r.ICGV.String())
63+
_, err := FindMatchingIngressClassByObject(tctx, r.Client, r.Log, &pc, r.ICGV.String())
6464
if err != nil {
6565
r.Log.V(1).Info("no matching IngressClass available",
6666
"ingressClassName", pc.Spec.IngressClassName,

internal/controller/apisixroute_controller.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,11 @@ func (r *ApisixRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
9191
}
9292

9393
bdr := ctrl.NewControllerManagedBy(mgr).
94-
For(&apiv2.ApisixRoute{}).
94+
For(&apiv2.ApisixRoute{},
95+
builder.WithPredicates(
96+
MatchesIngressClassPredicate(r.Client, r.Log, r.ICGV.String()),
97+
),
98+
).
9599
WithEventFilter(predicate.Or(eventFilters...)).
96100
Watches(
97101
icWatch,
@@ -151,16 +155,21 @@ func (r *ApisixRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request)
151155
err error
152156
)
153157

154-
if ic, err = GetIngressClass(tctx, r.Client, r.Log, ar.Spec.IngressClassName, r.ICGV.String()); err != nil {
158+
if ic, err = FindMatchingIngressClassByObject(tctx, r.Client, r.Log, &ar, r.ICGV.String()); err != nil {
155159
r.Log.V(1).Info("no matching IngressClass available",
156160
"ingressClassName", ar.Spec.IngressClassName,
157161
"error", err.Error())
162+
if err := r.Provider.Delete(ctx, &ar); err != nil {
163+
r.Log.Error(err, "failed to delete apisixroute", "apisixroute", ar)
164+
return ctrl.Result{}, err
165+
}
158166
return ctrl.Result{}, nil
159167
}
160168
defer func() { r.updateStatus(&ar, err) }()
161169

162170
if err = ProcessIngressClassParameters(tctx, r.Client, r.Log, &ar, ic); err != nil {
163-
return ctrl.Result{}, err
171+
r.Log.Error(err, "failed to process IngressClass parameters", "ingressClass", ic.Name)
172+
return ctrl.Result{}, client.IgnoreNotFound(err)
164173
}
165174
if err = r.processApisixRoute(ctx, tctx, &ar); err != nil {
166175
return ctrl.Result{}, err

internal/controller/apisixtls_controller.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func (r *ApisixTlsReconciler) SetupWithManager(mgr ctrl.Manager) error {
7070
return ctrl.NewControllerManagedBy(mgr).
7171
For(&apiv2.ApisixTls{},
7272
builder.WithPredicates(
73-
predicate.NewPredicateFuncs(r.checkIngressClass),
73+
MatchesIngressClassPredicate(r.Client, r.Log, r.ICGV.String()),
7474
),
7575
).
7676
WithEventFilter(
@@ -126,7 +126,7 @@ func (r *ApisixTlsReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
126126
tctx := provider.NewDefaultTranslateContext(ctx)
127127

128128
// get the ingress class
129-
ingressClass, err := GetIngressClass(tctx, r.Client, r.Log, tls.Spec.IngressClassName, r.ICGV.String())
129+
ingressClass, err := FindMatchingIngressClassByObject(tctx, r.Client, r.Log, &tls, r.ICGV.String())
130130
if err != nil {
131131
r.Log.V(1).Info("no matching IngressClass available, skip processing",
132132
"ingressClassName", tls.Spec.IngressClassName,
@@ -238,16 +238,6 @@ func (r *ApisixTlsReconciler) updateStatus(tls *apiv2.ApisixTls, condition metav
238238
})
239239
}
240240

241-
// checkIngressClass checks if the ApisixTls uses the ingress class that we control
242-
func (r *ApisixTlsReconciler) checkIngressClass(obj client.Object) bool {
243-
tls, ok := obj.(*apiv2.ApisixTls)
244-
if !ok {
245-
return false
246-
}
247-
248-
return matchesIngressClass(context.Background(), r.Client, r.Log, tls.Spec.IngressClassName, r.ICGV.String())
249-
}
250-
251241
func (r *ApisixTlsReconciler) listApisixTlsForSecret(ctx context.Context, obj client.Object) []reconcile.Request {
252242
secret, ok := obj.(*corev1.Secret)
253243
if !ok {

internal/controller/apisixupstream_controller.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func (r *ApisixUpstreamReconciler) Reconcile(ctx context.Context, req ctrl.Reque
6060

6161
tctx := provider.NewDefaultTranslateContext(ctx)
6262

63-
_, err := GetIngressClass(tctx, r.Client, r.Log, au.Spec.IngressClassName, r.ICGV.String())
63+
_, err := FindMatchingIngressClassByObject(tctx, r.Client, r.Log, &au, r.ICGV.String())
6464
if err != nil {
6565
r.Log.V(1).Info("no matching IngressClass available, skip processing",
6666
"ingressClassName", au.Spec.IngressClassName,

internal/controller/gatewayproxy_controller.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"k8s.io/apimachinery/pkg/runtime/schema"
3131
k8stypes "k8s.io/apimachinery/pkg/types"
3232
ctrl "sigs.k8s.io/controller-runtime"
33+
"sigs.k8s.io/controller-runtime/pkg/builder"
3334
"sigs.k8s.io/controller-runtime/pkg/client"
3435
"sigs.k8s.io/controller-runtime/pkg/handler"
3536
"sigs.k8s.io/controller-runtime/pkg/predicate"
@@ -62,6 +63,13 @@ func (r *GatewayProxyController) SetupWithManager(mrg ctrl.Manager) error {
6263
// Check and store EndpointSlice API support
6364
r.supportsEndpointSlice = pkgutils.HasAPIResource(mrg, &discoveryv1.EndpointSlice{})
6465
r.supportsGateway = pkgutils.HasAPIResource(mrg, &gatewayv1.Gateway{})
66+
var icWatch client.Object
67+
switch r.ICGV.String() {
68+
case networkingv1beta1.SchemeGroupVersion.String():
69+
icWatch = &networkingv1beta1.IngressClass{}
70+
default:
71+
icWatch = &networkingv1.IngressClass{}
72+
}
6573

6674
eventFilters := []predicate.Predicate{
6775
predicate.GenerationChangedPredicate{},
@@ -77,6 +85,13 @@ func (r *GatewayProxyController) SetupWithManager(mrg ctrl.Manager) error {
7785
WithEventFilter(predicate.Or(eventFilters...)).
7886
Watches(&corev1.Service{},
7987
handler.EnqueueRequestsFromMapFunc(r.listGatewayProxiesForProviderService),
88+
).
89+
Watches(
90+
icWatch,
91+
handler.EnqueueRequestsFromMapFunc(r.listGatewayProxiesForIngressClass),
92+
builder.WithPredicates(
93+
predicate.NewPredicateFuncs(matchesIngressController),
94+
),
8095
)
8196

8297
// Conditionally watch EndpointSlice or Endpoints based on cluster API support
@@ -85,6 +100,12 @@ func (r *GatewayProxyController) SetupWithManager(mrg ctrl.Manager) error {
85100
r.listGatewayProxiesForProviderEndpoints,
86101
r.Log)
87102

103+
if r.supportsGateway {
104+
bdr = bdr.Watches(&gatewayv1.Gateway{},
105+
handler.EnqueueRequestsFromMapFunc(r.listGatewayProxiesByGateway),
106+
)
107+
}
108+
88109
return bdr.
89110
Watches(&corev1.Secret{},
90111
handler.EnqueueRequestsFromMapFunc(r.listGatewayProxiesForSecret),
@@ -265,3 +286,32 @@ func (r *GatewayProxyController) listGatewayProxiesForSecret(ctx context.Context
265286
indexer.SecretIndexRef: indexer.GenIndexKey(secret.GetNamespace(), secret.GetName()),
266287
})
267288
}
289+
290+
func (r *GatewayProxyController) listGatewayProxiesForIngressClass(ctx context.Context, object client.Object) []reconcile.Request {
291+
ingressClass := pkgutils.ConvertToIngressClassV1(object)
292+
293+
reqs := []reconcile.Request{}
294+
gp, _ := GetGatewayProxyByIngressClass(ctx, r.Client, ingressClass)
295+
if gp != nil {
296+
reqs = append(reqs, reconcile.Request{
297+
NamespacedName: utils.NamespacedName(gp),
298+
})
299+
}
300+
return reqs
301+
}
302+
303+
func (r *GatewayProxyController) listGatewayProxiesByGateway(ctx context.Context, object client.Object) []reconcile.Request {
304+
gateway, ok := object.(*gatewayv1.Gateway)
305+
if !ok {
306+
r.Log.Error(errors.New("unexpected object type"), "failed to convert object to IngressClass")
307+
return nil
308+
}
309+
reqs := []reconcile.Request{}
310+
gp, _ := GetGatewayProxyByGateway(ctx, r.Client, gateway)
311+
if gp != nil {
312+
reqs = append(reqs, reconcile.Request{
313+
NamespacedName: utils.NamespacedName(gp),
314+
})
315+
}
316+
return reqs
317+
}

internal/controller/httproutepolicy.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ func (r *IngressReconciler) updateHTTPRoutePolicyStatusOnDeleting(ctx context.Co
198198
if err := r.Get(ctx, namespacedName, &ingress); err != nil {
199199
continue
200200
}
201-
ingressClass, err := r.getIngressClass(ctx, &ingress)
201+
ingressClass, err := FindMatchingIngressClassByObject(ctx, r.Client, r.Log, &ingress, "")
202202
if err != nil {
203203
continue
204204
}

internal/controller/ingress_controller.go

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func (r *IngressReconciler) SetupWithManager(mgr ctrl.Manager) error {
8787
bdr := ctrl.NewControllerManagedBy(mgr).
8888
For(&networkingv1.Ingress{},
8989
builder.WithPredicates(
90-
predicate.NewPredicateFuncs(r.checkIngressClass),
90+
MatchesIngressClassPredicate(r.Client, r.Log, ""),
9191
),
9292
).
9393
WithEventFilter(predicate.Or(eventFilters...)).
@@ -166,10 +166,13 @@ func (r *IngressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
166166
// create a translate context
167167
tctx := provider.NewDefaultTranslateContext(ctx)
168168

169-
ingressClass, err := r.getIngressClass(ctx, ingress)
169+
ingressClass, err := FindMatchingIngressClassByObject(tctx, r.Client, r.Log, ingress, "")
170170
if err != nil {
171-
r.Log.Error(err, "failed to get IngressClass")
172-
return ctrl.Result{}, err
171+
if err := r.Provider.Delete(ctx, ingress); err != nil {
172+
r.Log.Error(err, "failed to delete ingress resources", "ingress", ingress.Name)
173+
return ctrl.Result{}, nil
174+
}
175+
return ctrl.Result{}, nil
173176
}
174177

175178
tctx.RouteParentRefs = append(tctx.RouteParentRefs, gatewayv1.ParentReference{
@@ -222,22 +225,6 @@ func (r *IngressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
222225
return ctrl.Result{}, nil
223226
}
224227

225-
// getIngressClass get the ingress class for the ingress
226-
func (r *IngressReconciler) getIngressClass(ctx context.Context, obj client.Object) (*networkingv1.IngressClass, error) {
227-
ingress := obj.(*networkingv1.Ingress)
228-
var ingressClassName string
229-
if ingress.Spec.IngressClassName != nil {
230-
ingressClassName = *ingress.Spec.IngressClassName
231-
}
232-
return GetIngressClass(ctx, r.Client, r.Log, ingressClassName, "")
233-
}
234-
235-
// checkIngressClass check if the ingress uses the ingress class that we control
236-
func (r *IngressReconciler) checkIngressClass(obj client.Object) bool {
237-
_, err := r.getIngressClass(context.Background(), obj)
238-
return err == nil
239-
}
240-
241228
// matchesIngressController check if the ingress class is controlled by us
242229
func (r *IngressReconciler) matchesIngressController(obj client.Object) bool {
243230
ingressClass, ok := obj.(*networkingv1.IngressClass)
@@ -322,7 +309,7 @@ func (r *IngressReconciler) listIngressesByService(ctx context.Context, obj clie
322309

323310
requests := make([]reconcile.Request, 0, len(ingressList.Items))
324311
for _, ingress := range ingressList.Items {
325-
if r.checkIngressClass(&ingress) {
312+
if MatchesIngressClass(r.Client, r.Log, &ingress, "") {
326313
requests = append(requests, reconcile.Request{
327314
NamespacedName: client.ObjectKey{
328315
Namespace: ingress.Namespace,
@@ -356,7 +343,7 @@ func (r *IngressReconciler) listIngressesByEndpoints(ctx context.Context, obj cl
356343

357344
requests := make([]reconcile.Request, 0, len(ingressList.Items))
358345
for _, ingress := range ingressList.Items {
359-
if r.checkIngressClass(&ingress) {
346+
if MatchesIngressClass(r.Client, r.Log, &ingress, "") {
360347
requests = append(requests, reconcile.Request{
361348
NamespacedName: client.ObjectKey{
362349
Namespace: ingress.Namespace,
@@ -389,7 +376,7 @@ func (r *IngressReconciler) listIngressesBySecret(ctx context.Context, obj clien
389376

390377
requests := make([]reconcile.Request, 0, len(ingressList.Items))
391378
for _, ingress := range ingressList.Items {
392-
if r.checkIngressClass(&ingress) {
379+
if MatchesIngressClass(r.Client, r.Log, &ingress, "") {
393380
requests = append(requests, reconcile.Request{
394381
NamespacedName: client.ObjectKey{
395382
Namespace: ingress.Namespace,

0 commit comments

Comments
 (0)