@@ -33,37 +33,21 @@ const (
3333 MaxConsistentHashTableSize = 5000011 // https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/cluster/v3/cluster.proto#config-cluster-v3-cluster-maglevlbconfig
3434)
3535
36- func (t * Translator ) ProcessBackendTrafficPolicies (resources * resource.Resources ,
36+ func (t * Translator ) ProcessBackendTrafficPolicies (
37+ translatorContext * TranslatorContext ,
38+ resources * resource.Resources ,
3739 gateways []* GatewayContext ,
3840 routes []RouteContext ,
3941 xdsIR resource.XdsIRMap ,
4042) []* egv1a1.BackendTrafficPolicy {
4143 backendTrafficPolicies := resources .BackendTrafficPolicies
4244 // BackendTrafficPolicies are already sorted by the provider layer
4345
44- routeMapSize := len (routes )
4546 gatewayMapSize := len (gateways )
4647 policyMapSize := len (backendTrafficPolicies )
4748
4849 res := make ([]* egv1a1.BackendTrafficPolicy , 0 , policyMapSize )
4950
50- // First build a map out of the routes and gateways for faster lookup since users might have thousands of routes or more.
51- routeMap := make (map [policyTargetRouteKey ]* policyRouteTargetContext , routeMapSize )
52- for _ , route := range routes {
53- key := policyTargetRouteKey {
54- Kind : string (route .GetRouteType ()),
55- Name : route .GetName (),
56- Namespace : route .GetNamespace (),
57- }
58- routeMap [key ] = & policyRouteTargetContext {RouteContext : route }
59- }
60-
61- gatewayMap := make (map [types.NamespacedName ]* policyGatewayTargetContext , gatewayMapSize )
62- for _ , gw := range gateways {
63- key := utils .NamespacedName (gw )
64- gatewayMap [key ] = & policyGatewayTargetContext {GatewayContext : gw }
65- }
66-
6751 // Map of Gateway to the routes attached to it.
6852 gatewayRouteMap := & GatewayPolicyRouteMap {
6953 Routes : make (map [NamespacedNameWithSection ]sets.Set [string ], gatewayMapSize ),
@@ -88,7 +72,7 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
8872 // 4. Finally, the policies targeting Gateways
8973
9074 // Build gateway policy maps, which are needed when processing the policies targeting xRoutes.
91- t .buildGatewayPolicyMap (backendTrafficPolicies , gateways , gatewayMap , gatewayPolicyMap )
75+ t .buildGatewayPolicyMap (translatorContext , backendTrafficPolicies , gateways , gatewayPolicyMap )
9276
9377 // Process the policies targeting RouteRules
9478 for _ , currPolicy := range backendTrafficPolicies {
@@ -104,8 +88,8 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
10488 res = append (res , policy )
10589 }
10690
107- t .processBackendTrafficPolicyForRoute (resources , xdsIR ,
108- routeMap , gatewayRouteMap , gatewayPolicyMerged , gatewayPolicyMap , policy , currTarget )
91+ t .processBackendTrafficPolicyForRoute (translatorContext , resources , xdsIR ,
92+ gatewayRouteMap , gatewayPolicyMerged , gatewayPolicyMap , policy , currTarget )
10993 }
11094 }
11195 }
@@ -124,8 +108,8 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
124108 res = append (res , policy )
125109 }
126110
127- t .processBackendTrafficPolicyForRoute (resources , xdsIR ,
128- routeMap , gatewayRouteMap , gatewayPolicyMerged , gatewayPolicyMap , policy , currTarget )
111+ t .processBackendTrafficPolicyForRoute (translatorContext , resources , xdsIR ,
112+ gatewayRouteMap , gatewayPolicyMerged , gatewayPolicyMap , policy , currTarget )
129113 }
130114 }
131115 }
@@ -143,8 +127,8 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
143127 handledPolicies [policyName ] = policy
144128 res = append (res , policy )
145129 }
146- t .processBackendTrafficPolicyForGateway (resources , xdsIR ,
147- gatewayMap , gatewayRouteMap , gatewayPolicyMerged , policy , currTarget )
130+ t .processBackendTrafficPolicyForGateway (translatorContext , resources , xdsIR ,
131+ gatewayRouteMap , gatewayPolicyMerged , policy , currTarget )
148132 }
149133 }
150134 }
@@ -162,8 +146,8 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
162146 handledPolicies [policyName ] = policy
163147 res = append (res , policy )
164148 }
165- t .processBackendTrafficPolicyForGateway (resources , xdsIR ,
166- gatewayMap , gatewayRouteMap , gatewayPolicyMerged , policy , currTarget )
149+ t .processBackendTrafficPolicyForGateway (translatorContext , resources , xdsIR ,
150+ gatewayRouteMap , gatewayPolicyMerged , policy , currTarget )
167151 }
168152 }
169153 }
@@ -178,9 +162,9 @@ func (t *Translator) ProcessBackendTrafficPolicies(resources *resource.Resources
178162}
179163
180164func (t * Translator ) buildGatewayPolicyMap (
165+ translatorContext * TranslatorContext ,
181166 backendTrafficPolicies []* egv1a1.BackendTrafficPolicy ,
182167 gateways []* GatewayContext ,
183- gatewayMap map [types.NamespacedName ]* policyGatewayTargetContext ,
184168 gatewayPolicyMap map [NamespacedNameWithSection ]* egv1a1.BackendTrafficPolicy ,
185169) {
186170 for _ , currPolicy := range backendTrafficPolicies {
@@ -192,8 +176,8 @@ func (t *Translator) buildGatewayPolicyMap(
192176 Name : string (currTarget .Name ),
193177 Namespace : currPolicy .Namespace ,
194178 }
195- gateway , ok := gatewayMap [ key ]
196- if ! ok {
179+ gateway := translatorContext . GetPolicyTargetGateway ( key )
180+ if gateway == nil {
197181 continue
198182 }
199183
@@ -222,9 +206,9 @@ func (t *Translator) buildGatewayPolicyMap(
222206}
223207
224208func (t * Translator ) processBackendTrafficPolicyForRoute (
209+ translatorContext * TranslatorContext ,
225210 resources * resource.Resources ,
226211 xdsIR resource.XdsIRMap ,
227- routeMap map [policyTargetRouteKey ]* policyRouteTargetContext ,
228212 gatewayRouteMap * GatewayPolicyRouteMap ,
229213 gatewayPolicyMergedMap * GatewayPolicyRouteMap ,
230214 gatewayPolicyMap map [NamespacedNameWithSection ]* egv1a1.BackendTrafficPolicy ,
@@ -236,7 +220,7 @@ func (t *Translator) processBackendTrafficPolicyForRoute(
236220 resolveErr * status.PolicyResolveError
237221 )
238222
239- targetedRoute , resolveErr = resolveBackendTrafficPolicyRouteTargetRef (policy , currTarget , routeMap )
223+ targetedRoute , resolveErr = resolveBackendTrafficPolicyRouteTargetRef (translatorContext , policy , currTarget )
240224 // Skip if the route is not found
241225 // It's not necessarily an error because the BackendTrafficPolicy may be
242226 // reconciled by multiple controllers. And the other controller may
@@ -398,7 +382,8 @@ func (t *Translator) processBackendTrafficPolicyForRoute(
398382 Name : string (currTarget .Name ),
399383 Namespace : policy .Namespace ,
400384 }
401- overriddenTargetsMessage := getOverriddenTargetsMessageForRoute (routeMap [key ], currTarget .SectionName )
385+ overriddenTargetsMessage := getOverriddenTargetsMessageForRoute (
386+ translatorContext .GetPolicyTargetRoute (key ), currTarget .SectionName , egv1a1 .KindBackendTrafficPolicy )
402387 if overriddenTargetsMessage != "" {
403388 status .SetConditionForPolicyAncestors (& policy .Status ,
404389 ancestorRefs ,
@@ -413,9 +398,9 @@ func (t *Translator) processBackendTrafficPolicyForRoute(
413398}
414399
415400func (t * Translator ) processBackendTrafficPolicyForGateway (
401+ translatorContext * TranslatorContext ,
416402 resources * resource.Resources ,
417403 xdsIR resource.XdsIRMap ,
418- gatewayMap map [types.NamespacedName ]* policyGatewayTargetContext ,
419404 gatewayRouteMap * GatewayPolicyRouteMap ,
420405 gatewayPolicyMergedMap * GatewayPolicyRouteMap ,
421406 policy * egv1a1.BackendTrafficPolicy ,
@@ -427,7 +412,7 @@ func (t *Translator) processBackendTrafficPolicyForGateway(
427412 )
428413
429414 // Negative statuses have already been assigned so it's safe to skip
430- targetedGateway , resolveErr = resolveBackendTrafficPolicyGatewayTargetRef (policy , currTarget , gatewayMap )
415+ targetedGateway , resolveErr = resolveBackendTrafficPolicyGatewayTargetRef (translatorContext , policy , currTarget )
431416 if targetedGateway == nil {
432417 return
433418 }
@@ -461,7 +446,7 @@ func (t *Translator) processBackendTrafficPolicyForGateway(
461446 status .SetAcceptedForPolicyAncestor (& policy .Status , & ancestorRef , t .GatewayControllerName , policy .Generation )
462447
463448 overriddenMessage , mergedMessage := getOverriddenAndMergedTargetsMessageForGateway (
464- gatewayMap [ gatewayNN ] , gatewayRouteMap , gatewayPolicyMergedMap , currTarget .SectionName )
449+ translatorContext . GetPolicyTargetGateway ( gatewayNN ) , gatewayRouteMap , gatewayPolicyMergedMap , currTarget .SectionName , egv1a1 . KindBackendTrafficPolicy )
465450
466451 if mergedMessage != "" {
467452 status .SetConditionForPolicyAncestor (& policy .Status ,
@@ -488,19 +473,19 @@ func (t *Translator) processBackendTrafficPolicyForGateway(
488473}
489474
490475func resolveBackendTrafficPolicyGatewayTargetRef (
476+ translatorContext * TranslatorContext ,
491477 policy * egv1a1.BackendTrafficPolicy ,
492478 target gwapiv1.LocalPolicyTargetReferenceWithSectionName ,
493- gateways map [types.NamespacedName ]* policyGatewayTargetContext ,
494479) (* GatewayContext , * status.PolicyResolveError ) {
495480 // Check if the gateway exists
496481 key := types.NamespacedName {
497482 Name : string (target .Name ),
498483 Namespace : policy .Namespace ,
499484 }
500- gateway , ok := gateways [ key ]
485+ gateway := translatorContext . GetPolicyTargetGateway ( key )
501486
502487 // Gateway not found
503- if ! ok {
488+ if gateway == nil {
504489 return nil , nil
505490 }
506491
@@ -517,7 +502,7 @@ func resolveBackendTrafficPolicyGatewayTargetRef(
517502
518503 if target .SectionName == nil {
519504 // Check if another policy targeting the same Gateway exists
520- if gateway .attached {
505+ if gateway .attached != nil && gateway . attached [ egv1a1 . KindBackendTrafficPolicy ] {
521506 message := fmt .Sprintf ("Unable to target Gateway %s, another BackendTrafficPolicy has already attached to it" ,
522507 string (target .Name ))
523508
@@ -526,12 +511,16 @@ func resolveBackendTrafficPolicyGatewayTargetRef(
526511 Message : message ,
527512 }
528513 }
514+ if gateway .attached == nil {
515+ gateway .attached = make (map [string ]bool )
516+ }
529517
530518 // Set context and save
531- gateway .attached = true
519+ gateway .attached [ egv1a1 . KindBackendTrafficPolicy ] = true
532520 } else {
533521 listenerName := string (* target .SectionName )
534- if gateway .attachedToListeners != nil && gateway .attachedToListeners .Has (listenerName ) {
522+ if gateway .attachedToListeners != nil && gateway .attachedToListeners [egv1a1 .KindBackendTrafficPolicy ] != nil &&
523+ gateway .attachedToListeners [egv1a1 .KindBackendTrafficPolicy ].Has (listenerName ) {
535524 message := fmt .Sprintf ("Unable to target Listener %s/%s, another BackendTrafficPolicy has already attached to it" ,
536525 key , listenerName )
537526
@@ -541,20 +530,21 @@ func resolveBackendTrafficPolicyGatewayTargetRef(
541530 }
542531 }
543532 if gateway .attachedToListeners == nil {
544- gateway .attachedToListeners = make (sets.Set [string ])
533+ gateway .attachedToListeners = make (map [string ]sets.Set [string ])
534+ }
535+ if gateway .attachedToListeners [egv1a1 .KindBackendTrafficPolicy ] == nil {
536+ gateway .attachedToListeners [egv1a1 .KindBackendTrafficPolicy ] = make (sets.Set [string ])
545537 }
546- gateway .attachedToListeners .Insert (listenerName )
538+ gateway .attachedToListeners [ egv1a1 . KindBackendTrafficPolicy ] .Insert (listenerName )
547539 }
548540
549- gateways [key ] = gateway
550-
551541 return gateway .GatewayContext , nil
552542}
553543
554544func resolveBackendTrafficPolicyRouteTargetRef (
545+ translatorContext * TranslatorContext ,
555546 policy * egv1a1.BackendTrafficPolicy ,
556547 target gwapiv1.LocalPolicyTargetReferenceWithSectionName ,
557- routes map [policyTargetRouteKey ]* policyRouteTargetContext ,
558548) (RouteContext , * status.PolicyResolveError ) {
559549 // Check if the route exists
560550 key := policyTargetRouteKey {
@@ -563,9 +553,9 @@ func resolveBackendTrafficPolicyRouteTargetRef(
563553 Namespace : policy .Namespace ,
564554 }
565555
566- route , ok := routes [ key ]
556+ route := translatorContext . GetPolicyTargetRoute ( key )
567557 // Route not found
568- if ! ok {
558+ if route == nil {
569559 return nil , nil
570560 }
571561
@@ -578,7 +568,7 @@ func resolveBackendTrafficPolicyRouteTargetRef(
578568
579569 if target .SectionName == nil {
580570 // Check if another policy targeting the same xRoute exists
581- if route .attached {
571+ if route .attached != nil && route . attached [ egv1a1 . KindBackendTrafficPolicy ] {
582572 message := fmt .Sprintf ("Unable to target %s %s, another BackendTrafficPolicy has already attached to it" ,
583573 string (target .Kind ), string (target .Name ))
584574
@@ -587,10 +577,14 @@ func resolveBackendTrafficPolicyRouteTargetRef(
587577 Message : message ,
588578 }
589579 }
590- route .attached = true
580+ if route .attached == nil {
581+ route .attached = make (map [string ]bool )
582+ }
583+ route .attached [egv1a1 .KindBackendTrafficPolicy ] = true
591584 } else {
592585 routeRuleName := string (* target .SectionName )
593- if route .attachedToRouteRules != nil && route .attachedToRouteRules .Has (routeRuleName ) {
586+ if route .attachedToRouteRules != nil && route .attachedToRouteRules [egv1a1 .KindBackendTrafficPolicy ] != nil &&
587+ route .attachedToRouteRules [egv1a1 .KindBackendTrafficPolicy ].Has (routeRuleName ) {
594588 message := fmt .Sprintf ("Unable to target RouteRule %s/%s, another BackendTrafficPolicy has already attached to it" ,
595589 string (target .Name ), routeRuleName )
596590
@@ -600,13 +594,14 @@ func resolveBackendTrafficPolicyRouteTargetRef(
600594 }
601595 }
602596 if route .attachedToRouteRules == nil {
603- route .attachedToRouteRules = make (sets.Set [string ])
597+ route .attachedToRouteRules = make (map [string ]sets.Set [string ])
598+ }
599+ if route .attachedToRouteRules [egv1a1 .KindBackendTrafficPolicy ] == nil {
600+ route .attachedToRouteRules [egv1a1 .KindBackendTrafficPolicy ] = make (sets.Set [string ])
604601 }
605- route .attachedToRouteRules .Insert (routeRuleName )
602+ route .attachedToRouteRules [ egv1a1 . KindBackendTrafficPolicy ] .Insert (routeRuleName )
606603 }
607604
608- routes [key ] = route
609-
610605 return route .RouteContext , nil
611606}
612607
0 commit comments