@@ -27,10 +27,12 @@ import (
2727 ctrl "sigs.k8s.io/controller-runtime"
2828 "sigs.k8s.io/controller-runtime/pkg/builder"
2929 "sigs.k8s.io/controller-runtime/pkg/client"
30+ "sigs.k8s.io/controller-runtime/pkg/event"
3031 "sigs.k8s.io/controller-runtime/pkg/handler"
3132 "sigs.k8s.io/controller-runtime/pkg/predicate"
3233 "sigs.k8s.io/controller-runtime/pkg/reconcile"
3334 gatewayv1 "sigs.k8s.io/gateway-api/apis/v1"
35+ "sigs.k8s.io/gateway-api/apis/v1beta1"
3436
3537 "github.com/apache/apisix-ingress-controller/api/v1alpha1"
3638 "github.com/apache/apisix-ingress-controller/internal/controller/indexer"
@@ -83,6 +85,23 @@ func (r *GatewayReconciler) SetupWithManager(mgr ctrl.Manager) error {
8385 & corev1.Secret {},
8486 handler .EnqueueRequestsFromMapFunc (r .listGatewaysForSecret ),
8587 ).
88+ Watches (& v1beta1.ReferenceGrant {},
89+ handler .EnqueueRequestsFromMapFunc (r .listReferenceGrantsForGateway ),
90+ builder .WithPredicates (predicate.Funcs {
91+ CreateFunc : func (e event.CreateEvent ) bool {
92+ return referenceGrantHasGatewayFrom (e .Object )
93+ },
94+ UpdateFunc : func (e event.UpdateEvent ) bool {
95+ return referenceGrantHasGatewayFrom (e .ObjectOld ) || referenceGrantHasGatewayFrom (e .ObjectNew )
96+ },
97+ DeleteFunc : func (e event.DeleteEvent ) bool {
98+ return referenceGrantHasGatewayFrom (e .Object )
99+ },
100+ GenericFunc : func (e event.GenericEvent ) bool {
101+ return referenceGrantHasGatewayFrom (e .Object )
102+ },
103+ }),
104+ ).
86105 Complete (r )
87106}
88107
@@ -117,7 +136,7 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
117136 msg : acceptedMessage ("gateway" ),
118137 }
119138
120- // create a translate context
139+ // create a translation context
121140 tctx := provider .NewDefaultTranslateContext (ctx )
122141
123142 r .processListenerConfig (tctx , gateway )
@@ -164,20 +183,25 @@ func (r *GatewayReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ct
164183 }
165184 }
166185
167- ListenerStatuses , err := getListenerStatus (ctx , r .Client , gateway )
186+ var referenceGrantList v1beta1.ReferenceGrantList
187+ if err := r .List (ctx , & referenceGrantList ); err != nil {
188+ r .Log .Error (err , "failed to list reference grants" )
189+ return ctrl.Result {}, err
190+ }
191+ listenerStatuses , err := getListenerStatus (ctx , r .Client , gateway , referenceGrantList .Items )
168192 if err != nil {
169- log . Error (err , "failed to get listener status" , "gateway" , gateway .GetName ())
193+ r . Log . Error (err , "failed to get listener status" , "gateway" , types. NamespacedName { Namespace : gateway .GetNamespace (), Name : gateway . GetName ()} )
170194 return ctrl.Result {}, err
171195 }
172196
173197 accepted := SetGatewayConditionAccepted (gateway , acceptStatus .status , acceptStatus .msg )
174- Programmed := SetGatewayConditionProgrammed (gateway , conditionProgrammedStatus , conditionProgrammedMsg )
175- if accepted || Programmed || len (addrs ) > 0 || len (ListenerStatuses ) > 0 {
198+ programmed := SetGatewayConditionProgrammed (gateway , conditionProgrammedStatus , conditionProgrammedMsg )
199+ if accepted || programmed || len (addrs ) > 0 || len (listenerStatuses ) > 0 {
176200 if len (addrs ) > 0 {
177201 gateway .Status .Addresses = addrs
178202 }
179- if len (ListenerStatuses ) > 0 {
180- gateway .Status .Listeners = ListenerStatuses
203+ if len (listenerStatuses ) > 0 {
204+ gateway .Status .Listeners = listenerStatuses
181205 }
182206
183207 return ctrl.Result {}, r .Status ().Update (ctx , gateway )
@@ -348,6 +372,56 @@ func (r *GatewayReconciler) listGatewaysForSecret(ctx context.Context, obj clien
348372 return requests
349373}
350374
375+ func (r * GatewayReconciler ) listReferenceGrantsForGateway (ctx context.Context , obj client.Object ) (requests []reconcile.Request ) {
376+ grant , ok := obj .(* v1beta1.ReferenceGrant )
377+ if ! ok {
378+ r .Log .Error (
379+ errors .New ("unexpected object type" ),
380+ "ReferenceGrant watch predicate received unexpected object type" ,
381+ "expected" , FullTypeName (new (v1beta1.ReferenceGrant )), "found" , FullTypeName (obj ),
382+ )
383+ return nil
384+ }
385+
386+ var gatewayList gatewayv1.GatewayList
387+ if err := r .List (ctx , & gatewayList ); err != nil {
388+ r .Log .Error (err , "failed to list gateways in watch predicate" , "ReferenceGrant" , grant .GetName ())
389+ return nil
390+ }
391+
392+ for _ , gateway := range gatewayList .Items {
393+ for _ , from := range grant .Spec .From {
394+ gw := v1beta1.ReferenceGrantFrom {
395+ Group : gatewayv1 .GroupName ,
396+ Kind : KindGateway ,
397+ Namespace : v1beta1 .Namespace (gateway .GetNamespace ()),
398+ }
399+ if from == gw {
400+ requests = append (requests , reconcile.Request {
401+ NamespacedName : types.NamespacedName {
402+ Namespace : gateway .GetNamespace (),
403+ Name : gateway .GetName (),
404+ },
405+ })
406+ }
407+ }
408+ }
409+ return requests
410+ }
411+
412+ func referenceGrantHasGatewayFrom (obj client.Object ) bool {
413+ grant , ok := obj .(* v1beta1.ReferenceGrant )
414+ if ! ok {
415+ return false
416+ }
417+ for _ , from := range grant .Spec .From {
418+ if from .Kind == KindGateway && string (from .Group ) == gatewayv1 .GroupName {
419+ return true
420+ }
421+ }
422+ return false
423+ }
424+
351425func (r * GatewayReconciler ) processInfrastructure (tctx * provider.TranslateContext , gateway * gatewayv1.Gateway ) error {
352426 rk := provider.ResourceKind {
353427 Kind : gateway .Kind ,
0 commit comments