@@ -72,6 +72,54 @@ func (r *HTTPRouteReconciler) SetupWithManager(mgr ctrl.Manager) error {
7272 },
7373 ),
7474 ).
75+ Watches (& v1alpha1.BackendTrafficPolicy {},
76+ handler .EnqueueRequestsFromMapFunc (r .listHTTPRoutesForBackendTrafficPolicy ),
77+ builder .WithPredicates (
78+ predicate.Funcs {
79+ GenericFunc : func (e event.GenericEvent ) bool {
80+ return false
81+ },
82+ DeleteFunc : func (e event.DeleteEvent ) bool {
83+ return true
84+ },
85+ CreateFunc : func (e event.CreateEvent ) bool {
86+ return true
87+ },
88+ UpdateFunc : func (e event.UpdateEvent ) bool {
89+ oldObj , ok := e .ObjectOld .(* v1alpha1.BackendTrafficPolicy )
90+ newObj , ok2 := e .ObjectNew .(* v1alpha1.BackendTrafficPolicy )
91+ if ! ok || ! ok2 {
92+ return false
93+ }
94+ oldRefs := oldObj .Spec .TargetRefs
95+ newRefs := newObj .Spec .TargetRefs
96+
97+ oldRefMap := make (map [string ]v1alpha1.BackendPolicyTargetReferenceWithSectionName )
98+ for _ , ref := range oldRefs {
99+ key := fmt .Sprintf ("%s/%s/%s" , ref .Group , ref .Kind , ref .Name )
100+ oldRefMap [key ] = ref
101+ }
102+
103+ for _ , ref := range newRefs {
104+ key := fmt .Sprintf ("%s/%s/%s" , ref .Group , ref .Kind , ref .Name )
105+ delete (oldRefMap , key )
106+ }
107+ if len (oldRefMap ) > 0 {
108+ targetRefs := make ([]v1alpha1.BackendPolicyTargetReferenceWithSectionName , 0 , len (oldRefs ))
109+ for _ , ref := range oldRefMap {
110+ targetRefs = append (targetRefs , ref )
111+ }
112+ dump := oldObj .DeepCopy ()
113+ dump .Spec .TargetRefs = targetRefs
114+ r .genericEvent <- event.GenericEvent {
115+ Object : dump ,
116+ }
117+ }
118+ return true
119+ },
120+ },
121+ ),
122+ ).
75123 Watches (& v1alpha1.HTTPRoutePolicy {},
76124 handler .EnqueueRequestsFromMapFunc (r .listHTTPRouteByHTTPRoutePolicy ),
77125 builder .WithPredicates (
@@ -144,6 +192,7 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
144192
145193 tctx := provider .NewDefaultTranslateContext (ctx )
146194
195+ tctx .RouteParentRefs = hr .Spec .ParentRefs
147196 rk := provider.ResourceKind {
148197 Kind : hr .Kind ,
149198 Namespace : hr .Namespace ,
@@ -173,6 +222,8 @@ func (r *HTTPRouteReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
173222 }
174223 }
175224
225+ ProcessBackendTrafficPolicy (r .Client , r .Log , tctx )
226+
176227 if err := r .Provider .Update (ctx , tctx , hr ); err != nil {
177228 acceptStatus .status = false
178229 acceptStatus .msg = err .Error ()
@@ -256,6 +307,54 @@ func (r *HTTPRouteReconciler) listHTTPRoutesByExtensionRef(ctx context.Context,
256307 return requests
257308}
258309
310+ func (r * HTTPRouteReconciler ) listHTTPRoutesForBackendTrafficPolicy (ctx context.Context , obj client.Object ) []reconcile.Request {
311+ policy , ok := obj .(* v1alpha1.BackendTrafficPolicy )
312+ if ! ok {
313+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to BackendTrafficPolicy" )
314+ return nil
315+ }
316+
317+ httprouteList := []gatewayv1.HTTPRoute {}
318+ for _ , targetRef := range policy .Spec .TargetRefs {
319+ service := & corev1.Service {}
320+ if err := r .Get (ctx , client.ObjectKey {
321+ Namespace : policy .Namespace ,
322+ Name : string (targetRef .Name ),
323+ }, service ); err != nil {
324+ if client .IgnoreNotFound (err ) != nil {
325+ r .Log .Error (err , "failed to get service" , "namespace" , policy .Namespace , "name" , targetRef .Name )
326+ }
327+ continue
328+ }
329+ hrList := & gatewayv1.HTTPRouteList {}
330+ if err := r .List (ctx , hrList , client.MatchingFields {
331+ indexer .ServiceIndexRef : indexer .GenIndexKey (policy .Namespace , string (targetRef .Name )),
332+ }); err != nil {
333+ r .Log .Error (err , "failed to list httproutes by service reference" , "service" , targetRef .Name )
334+ return nil
335+ }
336+ httprouteList = append (httprouteList , hrList .Items ... )
337+ }
338+ var namespacedNameMap = make (map [types.NamespacedName ]struct {})
339+ requests := make ([]reconcile.Request , 0 , len (httprouteList ))
340+ for _ , hr := range httprouteList {
341+ key := types.NamespacedName {
342+ Namespace : hr .Namespace ,
343+ Name : hr .Name ,
344+ }
345+ if _ , ok := namespacedNameMap [key ]; ! ok {
346+ namespacedNameMap [key ] = struct {}{}
347+ requests = append (requests , reconcile.Request {
348+ NamespacedName : client.ObjectKey {
349+ Namespace : hr .Namespace ,
350+ Name : hr .Name ,
351+ },
352+ })
353+ }
354+ }
355+ return requests
356+ }
357+
259358func (r * HTTPRouteReconciler ) listHTTPRoutesForGateway (ctx context.Context , obj client.Object ) []reconcile.Request {
260359 gateway , ok := obj .(* gatewayv1.Gateway )
261360 if ! ok {
@@ -330,27 +429,53 @@ func (r *HTTPRouteReconciler) listHTTPRouteByHTTPRoutePolicy(ctx context.Context
330429 return requests
331430}
332431
333- func (r * HTTPRouteReconciler ) listHTTPRouteForGenericEvent (ctx context.Context , obj client.Object ) []reconcile.Request {
432+ func (r * HTTPRouteReconciler ) listHTTPRouteForGenericEvent (ctx context.Context , obj client.Object ) (requests []reconcile.Request ) {
433+ var namespacedNameMap = make (map [types.NamespacedName ]struct {})
434+
334435 switch v := obj .(type ) {
436+ case * v1alpha1.BackendTrafficPolicy :
437+ httprouteAll := []gatewayv1.HTTPRoute {}
438+ for _ , ref := range v .Spec .TargetRefs {
439+ httprouteList := & gatewayv1.HTTPRouteList {}
440+ if err := r .List (ctx , httprouteList , client.MatchingFields {
441+ indexer .ServiceIndexRef : indexer .GenIndexKey (v .GetNamespace (), string (ref .Name )),
442+ }); err != nil {
443+ r .Log .Error (err , "failed to list HTTPRoutes for BackendTrafficPolicy" , "namespace" , v .GetNamespace (), "ref" , ref .Name )
444+ return nil
445+ }
446+ httprouteAll = append (httprouteAll , httprouteList .Items ... )
447+ }
448+ for _ , hr := range httprouteAll {
449+ key := types.NamespacedName {
450+ Namespace : hr .Namespace ,
451+ Name : hr .Name ,
452+ }
453+ if _ , ok := namespacedNameMap [key ]; ! ok {
454+ namespacedNameMap [key ] = struct {}{}
455+ requests = append (requests , reconcile.Request {
456+ NamespacedName : client.ObjectKey {
457+ Namespace : hr .Namespace ,
458+ Name : hr .Name ,
459+ },
460+ })
461+ }
462+ }
335463 case * v1alpha1.HTTPRoutePolicy :
336- var (
337- namespacedNames = make (map [types.NamespacedName ]struct {})
338- requests []reconcile.Request
339- )
340464 for _ , ref := range v .Spec .TargetRefs {
341465 namespacedName := types.NamespacedName {Namespace : v .GetNamespace (), Name : string (ref .Name )}
342- if _ , ok := namespacedNames [namespacedName ]; ! ok {
343- namespacedNames [namespacedName ] = struct {}{}
466+ if _ , ok := namespacedNameMap [namespacedName ]; ! ok {
467+ namespacedNameMap [namespacedName ] = struct {}{}
344468 if err := r .Get (ctx , namespacedName , new (gatewayv1.HTTPRoute )); err != nil {
345469 r .Log .Info ("failed to Get HTTPRoute" , "namespace" , namespacedName .Namespace , "name" , namespacedName .Name )
346470 continue
347471 }
348472 requests = append (requests , reconcile.Request {NamespacedName : namespacedName })
349473 }
350474 }
351- return requests
475+ default :
476+ r .Log .Error (fmt .Errorf ("unexpected object type" ), "failed to convert object to BackendTrafficPolicy" )
352477 }
353- return nil
478+ return requests
354479}
355480
356481func (r * HTTPRouteReconciler ) processHTTPRouteBackendRefs (tctx * provider.TranslateContext ) error {
0 commit comments