@@ -19,12 +19,16 @@ import (
1919 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2020 "k8s.io/apimachinery/pkg/runtime"
2121 "k8s.io/apimachinery/pkg/types"
22+ "k8s.io/utils/ptr"
2223 ctrl "sigs.k8s.io/controller-runtime"
2324 "sigs.k8s.io/controller-runtime/pkg/builder"
2425 "sigs.k8s.io/controller-runtime/pkg/client"
26+ "sigs.k8s.io/controller-runtime/pkg/event"
2527 "sigs.k8s.io/controller-runtime/pkg/handler"
2628 "sigs.k8s.io/controller-runtime/pkg/predicate"
2729 "sigs.k8s.io/controller-runtime/pkg/reconcile"
30+ "sigs.k8s.io/controller-runtime/pkg/source"
31+ gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
2832)
2933
3034// IngressReconciler reconciles a Ingress object.
@@ -33,11 +37,14 @@ type IngressReconciler struct { //nolint:revive
3337 Scheme * runtime.Scheme
3438 Log logr.Logger
3539
36- Provider provider.Provider
40+ Provider provider.Provider
41+ genericEvent chan event.GenericEvent
3742}
3843
3944// SetupWithManager sets up the controller with the Manager.
4045func (r * IngressReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
46+ r .genericEvent = make (chan event.GenericEvent , 100 )
47+
4148 return ctrl .NewControllerManagedBy (mgr ).
4249 For (& networkingv1.Ingress {},
4350 builder .WithPredicates (
@@ -65,6 +72,18 @@ func (r *IngressReconciler) SetupWithManager(mgr ctrl.Manager) error {
6572 & corev1.Secret {},
6673 handler .EnqueueRequestsFromMapFunc (r .listIngressesBySecret ),
6774 ).
75+ Watches (& v1alpha1.BackendTrafficPolicy {},
76+ handler .EnqueueRequestsFromMapFunc (r .listIngressForBackendTrafficPolicy ),
77+ builder .WithPredicates (
78+ BackendTrafficPolicyPredicateFunc (r .genericEvent ),
79+ ),
80+ ).
81+ WatchesRawSource (
82+ source .Channel (
83+ r .genericEvent ,
84+ handler .EnqueueRequestsFromMapFunc (r .listIngressForGenericEvent ),
85+ ),
86+ ).
6887 Complete (r )
6988}
7089
@@ -103,6 +122,12 @@ func (r *IngressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
103122 return ctrl.Result {}, err
104123 }
105124
125+ tctx .RouteParentRefs = append (tctx .RouteParentRefs , gatewayv1.ParentReference {
126+ Group : ptr .To (gatewayv1 .Group (ingressClass .GroupVersionKind ().Group )),
127+ Kind : ptr .To (gatewayv1 .Kind ("IngressClass" )),
128+ Name : gatewayv1 .ObjectName (ingressClass .Name ),
129+ })
130+
106131 // process IngressClass parameters if they reference GatewayProxy
107132 if err := r .processIngressClassParameters (ctx , tctx , ingress , ingressClass ); err != nil {
108133 r .Log .Error (err , "failed to process IngressClass parameters" , "ingressClass" , ingressClass .Name )
@@ -121,12 +146,17 @@ func (r *IngressReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
121146 return ctrl.Result {}, err
122147 }
123148
149+ ProcessBackendTrafficPolicy (r .Client , r .Log , tctx )
150+
124151 // update the ingress resources
125152 if err := r .Provider .Update (ctx , tctx , ingress ); err != nil {
126153 r .Log .Error (err , "failed to update ingress resources" , "ingress" , ingress .Name )
127154 return ctrl.Result {}, err
128155 }
129156
157+ // update the status of related resources
158+ UpdateStatus (r .Client , r .Log , tctx )
159+
130160 // update the ingress status
131161 if err := r .updateStatus (ctx , tctx , ingress , ingressClass ); err != nil {
132162 r .Log .Error (err , "failed to update ingress status" , "ingress" , ingress .Name )
@@ -341,6 +371,59 @@ func (r *IngressReconciler) listIngressesBySecret(ctx context.Context, obj clien
341371 return requests
342372}
343373
374+ func (r * IngressReconciler ) listIngressForBackendTrafficPolicy (ctx context.Context , obj client.Object ) (requests []reconcile.Request ) {
375+ v , ok := obj .(* v1alpha1.BackendTrafficPolicy )
376+ if ! ok {
377+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to BackendTrafficPolicy" )
378+ return nil
379+ }
380+ var namespacedNameMap = make (map [types.NamespacedName ]struct {})
381+ ingresses := []networkingv1.Ingress {}
382+ for _ , ref := range v .Spec .TargetRefs {
383+ service := & corev1.Service {}
384+ if err := r .Get (ctx , client.ObjectKey {
385+ Namespace : v .Namespace ,
386+ Name : string (ref .Name ),
387+ }, service ); err != nil {
388+ if client .IgnoreNotFound (err ) != nil {
389+ r .Log .Error (err , "failed to get service" , "namespace" , v .Namespace , "name" , ref .Name )
390+ }
391+ continue
392+ }
393+ ingressList := & networkingv1.IngressList {}
394+ if err := r .List (ctx , ingressList , client.MatchingFields {
395+ indexer .ServiceIndexRef : indexer .GenIndexKey (v .GetNamespace (), string (ref .Name )),
396+ }); err != nil {
397+ r .Log .Error (err , "failed to list HTTPRoutes for BackendTrafficPolicy" , "namespace" , v .GetNamespace (), "ref" , ref .Name )
398+ return nil
399+ }
400+ ingresses = append (ingresses , ingressList .Items ... )
401+ }
402+ for _ , ins := range ingresses {
403+ key := types.NamespacedName {
404+ Namespace : ins .Namespace ,
405+ Name : ins .Name ,
406+ }
407+ if _ , ok := namespacedNameMap [key ]; ! ok {
408+ namespacedNameMap [key ] = struct {}{}
409+ requests = append (requests , reconcile.Request {
410+ NamespacedName : key ,
411+ })
412+ }
413+ }
414+ return requests
415+ }
416+
417+ func (r * IngressReconciler ) listIngressForGenericEvent (ctx context.Context , obj client.Object ) (requests []reconcile.Request ) {
418+ switch v := obj .(type ) {
419+ case * v1alpha1.BackendTrafficPolicy :
420+ requests = r .listIngressForBackendTrafficPolicy (ctx , v )
421+ default :
422+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to BackendTrafficPolicy" )
423+ }
424+ return requests
425+ }
426+
344427// processTLS process the TLS configuration of the ingress
345428func (r * IngressReconciler ) processTLS (tctx * provider.TranslateContext , ingress * networkingv1.Ingress ) error {
346429 for _ , tls := range ingress .Spec .TLS {
0 commit comments