@@ -10,6 +10,7 @@ import (
1010 "github.com/api7/api7-ingress-controller/internal/provider"
1111 "github.com/api7/gopkg/pkg/log"
1212 "github.com/go-logr/logr"
13+ "go.uber.org/zap"
1314 corev1 "k8s.io/api/core/v1"
1415 discoveryv1 "k8s.io/api/discovery/v1"
1516 networkingv1 "k8s.io/api/networking/v1"
@@ -41,7 +42,12 @@ func (r *IngressReconciler) SetupWithManager(mgr ctrl.Manager) error {
4142 predicate .NewPredicateFuncs (r .checkIngressClass ),
4243 ),
4344 ).
44- WithEventFilter (predicate.GenerationChangedPredicate {}).
45+ WithEventFilter (
46+ predicate .Or (
47+ predicate.GenerationChangedPredicate {},
48+ predicate.AnnotationChangedPredicate {},
49+ ),
50+ ).
4551 Watches (
4652 & networkingv1.IngressClass {},
4753 handler .EnqueueRequestsFromMapFunc (r .listIngressForIngressClass ),
@@ -134,16 +140,19 @@ func (r *IngressReconciler) checkIngressClass(obj client.Object) bool {
134140 // find the ingress class that is marked as default
135141 for _ , ic := range ingressClassList .Items {
136142 if IsDefaultIngressClass (& ic ) && matchesController (ic .Spec .Controller ) {
143+ log .Debugw ("match the default ingress class" )
137144 return true
138145 }
139146 }
140147
148+ log .Debugw ("no default ingress class found" )
141149 return false
142150 }
143151
144152 configuredClass := config .GetIngressClass ()
145153 // if the ingress class name matches the configured ingress class name, return true
146154 if * ingress .Spec .IngressClassName == configuredClass {
155+ log .Debugw ("match the configured ingress class name" )
147156 return true
148157 }
149158
@@ -168,25 +177,55 @@ func (r *IngressReconciler) matchesIngressController(obj client.Object) bool {
168177}
169178
170179// listIngressForIngressClass list all ingresses that use a specific ingress class
171- func (r * IngressReconciler ) listIngressForIngressClass (ctx context.Context , ingressClass client.Object ) []reconcile.Request {
172- ingressList := & networkingv1.IngressList {}
173- if err := r .List (ctx , ingressList , client.MatchingFields {
174- indexer .IngressClassRef : ingressClass .GetName (),
175- }); err != nil {
176- r .Log .Error (err , "failed to list ingresses for ingress class" , "ingressclass" , ingressClass .GetName ())
180+ func (r * IngressReconciler ) listIngressForIngressClass (ctx context.Context , obj client.Object ) []reconcile.Request {
181+ ingressClass , ok := obj .(* networkingv1.IngressClass )
182+ if ! ok {
183+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to IngressClass" )
177184 return nil
178185 }
179186
180- requests := make ([]reconcile.Request , 0 , len (ingressList .Items ))
181- for _ , ingress := range ingressList .Items {
182- requests = append (requests , reconcile.Request {
183- NamespacedName : client.ObjectKey {
184- Namespace : ingress .Namespace ,
185- Name : ingress .Name ,
186- },
187- })
187+ // check if the ingress class is the default ingress class
188+ if IsDefaultIngressClass (ingressClass ) {
189+ ingressList := & networkingv1.IngressList {}
190+ if err := r .List (ctx , ingressList ); err != nil {
191+ r .Log .Error (err , "failed to list ingresses for ingress class" , "ingressclass" , ingressClass .GetName ())
192+ return nil
193+ }
194+
195+ requests := make ([]reconcile.Request , 0 , len (ingressList .Items ))
196+ for _ , ingress := range ingressList .Items {
197+ if ingress .Spec .IngressClassName == nil || * ingress .Spec .IngressClassName == "" ||
198+ * ingress .Spec .IngressClassName == ingressClass .GetName () {
199+ requests = append (requests , reconcile.Request {
200+ NamespacedName : client.ObjectKey {
201+ Namespace : ingress .Namespace ,
202+ Name : ingress .Name ,
203+ },
204+ })
205+ }
206+ }
207+ return requests
208+ } else {
209+ ingressList := & networkingv1.IngressList {}
210+ if err := r .List (ctx , ingressList , client.MatchingFields {
211+ indexer .IngressClassRef : ingressClass .GetName (),
212+ }); err != nil {
213+ r .Log .Error (err , "failed to list ingresses for ingress class" , "ingressclass" , ingressClass .GetName ())
214+ return nil
215+ }
216+
217+ requests := make ([]reconcile.Request , 0 , len (ingressList .Items ))
218+ for _ , ingress := range ingressList .Items {
219+ requests = append (requests , reconcile.Request {
220+ NamespacedName : client.ObjectKey {
221+ Namespace : ingress .Namespace ,
222+ Name : ingress .Name ,
223+ },
224+ })
225+ }
226+
227+ return requests
188228 }
189- return requests
190229}
191230
192231// listIngressesByService list all ingresses that use a specific service
@@ -210,12 +249,14 @@ func (r *IngressReconciler) listIngressesByService(ctx context.Context, obj clie
210249
211250 requests := make ([]reconcile.Request , 0 , len (ingressList .Items ))
212251 for _ , ingress := range ingressList .Items {
213- requests = append (requests , reconcile.Request {
214- NamespacedName : client.ObjectKey {
215- Namespace : ingress .Namespace ,
216- Name : ingress .Name ,
217- },
218- })
252+ if r .checkIngressClass (& ingress ) {
253+ requests = append (requests , reconcile.Request {
254+ NamespacedName : client.ObjectKey {
255+ Namespace : ingress .Namespace ,
256+ Name : ingress .Name ,
257+ },
258+ })
259+ }
219260 }
220261 return requests
221262}
@@ -241,12 +282,14 @@ func (r *IngressReconciler) listIngressesBySecret(ctx context.Context, obj clien
241282
242283 requests := make ([]reconcile.Request , 0 , len (ingressList .Items ))
243284 for _ , ingress := range ingressList .Items {
244- requests = append (requests , reconcile.Request {
245- NamespacedName : client.ObjectKey {
246- Namespace : ingress .Namespace ,
247- Name : ingress .Name ,
248- },
249- })
285+ if r .checkIngressClass (& ingress ) {
286+ requests = append (requests , reconcile.Request {
287+ NamespacedName : client.ObjectKey {
288+ Namespace : ingress .Namespace ,
289+ Name : ingress .Name ,
290+ },
291+ })
292+ }
250293 }
251294 return requests
252295}
@@ -267,6 +310,11 @@ func (r *IngressReconciler) processTLS(ctx context.Context, tctx *provider.Trans
267310 return err
268311 }
269312
313+ if secret .Data == nil {
314+ log .Warnw ("secret data is nil" , zap .String ("secret" , secret .Namespace + "/" + secret .Name ))
315+ continue
316+ }
317+
270318 // add the secret to the translate context
271319 tctx .Secrets [types.NamespacedName {Namespace : ingress .Namespace , Name : tls .SecretName }] = & secret
272320 }
@@ -283,19 +331,16 @@ func (r *IngressReconciler) processBackends(ctx context.Context, tctx *provider.
283331 if rule .HTTP == nil {
284332 continue
285333 }
286-
287334 for _ , path := range rule .HTTP .Paths {
288335 if path .Backend .Service == nil {
289336 continue
290337 }
291-
292338 service := path .Backend .Service
293339 if err := r .processBackendService (ctx , tctx , ingress .Namespace , service ); err != nil {
294340 terr = err
295341 }
296342 }
297343 }
298-
299344 return terr
300345}
301346
@@ -356,6 +401,11 @@ func (r *IngressReconciler) processBackendService(ctx context.Context, tctx *pro
356401 Name : backendService .Name ,
357402 }] = endpointSliceList .Items
358403
404+ tctx .Services [client.ObjectKey {
405+ Namespace : namespace ,
406+ Name : backendService .Name ,
407+ }] = & service
408+
359409 return nil
360410}
361411
@@ -383,6 +433,7 @@ func (r *IngressReconciler) updateStatus(ctx context.Context, ingress *networkin
383433 if err != nil {
384434 return fmt .Errorf ("invalid ingress-publish-service format: %s, expected format: namespace/name" , publishService )
385435 }
436+ // if the namespace is not specified, use the ingress namespace
386437 if namespace == "" {
387438 namespace = ingress .Namespace
388439 }
0 commit comments