diff --git a/internal/kgateway/translator/listener/gateway_listener_translator.go b/internal/kgateway/translator/listener/gateway_listener_translator.go index 9aa2f732775..c30d309e9ff 100644 --- a/internal/kgateway/translator/listener/gateway_listener_translator.go +++ b/internal/kgateway/translator/listener/gateway_listener_translator.go @@ -56,7 +56,7 @@ func TranslateListeners( })(nil) validatedListeners := validateGateway(gateway, reporter, settings) - mergedListeners := mergeGWListeners(queries, gateway.Namespace, validatedListeners, *gateway, routesForGw, reporter, settings) + mergedListeners := mergeGWListeners(queries, validatedListeners, *gateway, routesForGw, reporter, settings) translatedListeners := mergedListeners.translateListeners(kctx, ctx, queries, reporter) return translatedListeners @@ -64,7 +64,6 @@ func TranslateListeners( func mergeGWListeners( queries query.GatewayQueries, - gatewayNamespace string, listeners []ir.Listener, parentGw ir.Gateway, routesForGw *query.RoutesForGwResult, @@ -72,10 +71,9 @@ func mergeGWListeners( settings ListenerTranslatorConfig, ) *MergedListeners { ml := &MergedListeners{ - parentGw: parentGw, - GatewayNamespace: gatewayNamespace, - Queries: queries, - settings: settings, + parentGw: parentGw, + Queries: queries, + settings: settings, } for _, listener := range listeners { result := routesForGw.GetListenerResult(listener.Parent, string(listener.Name)) @@ -96,11 +94,10 @@ func mergeGWListeners( } type MergedListeners struct { - GatewayNamespace string - parentGw ir.Gateway - Listeners []*MergedListener - Queries query.GatewayQueries - settings ListenerTranslatorConfig + parentGw ir.Gateway + Listeners []*MergedListener + Queries query.GatewayQueries + settings ListenerTranslatorConfig } func (ml *MergedListeners) AppendListener( @@ -160,7 +157,6 @@ func (ml *MergedListeners) appendHttpListener( // create a new filter chain for the listener ml.Listeners = append(ml.Listeners, &MergedListener{ name: GenerateListenerName(listener), - gatewayNamespace: ml.GatewayNamespace, port: finalPort, httpFilterChain: fc, listenerReporter: reporter, @@ -182,6 +178,7 @@ func (ml *MergedListeners) appendHttpsListener( mfc := httpsFilterChain{ gatewayListenerName: query.GenerateRouteKey(listener.Parent, string(listener.Name)), + parentNamespace: listener.Parent.GetNamespace(), sniDomain: listener.Hostname, tls: tls, routesWithHosts: routesWithHosts, @@ -200,7 +197,6 @@ func (ml *MergedListeners) appendHttpsListener( ml.Listeners = append(ml.Listeners, &MergedListener{ name: GenerateListenerName(listener), - gatewayNamespace: ml.GatewayNamespace, port: finalPort, httpsFilterChains: []httpsFilterChain{mfc}, listenerReporter: reporter, @@ -217,6 +213,7 @@ func (ml *MergedListeners) AppendTcpListener( ) { parent := tcpFilterChainParent{ gatewayListenerName: query.GenerateRouteKey(listener.Parent, string(listener.Name)), + parentNamespace: listener.Parent.GetNamespace(), routesWithHosts: routeInfos, } fc := tcpFilterChain{ @@ -235,7 +232,6 @@ func (ml *MergedListeners) AppendTcpListener( // create a new filter chain for the listener ml.Listeners = append(ml.Listeners, &MergedListener{ name: GenerateListenerName(listener), - gatewayNamespace: ml.GatewayNamespace, port: finalPort, TcpFilterChains: []tcpFilterChain{fc}, listenerReporter: reporter, @@ -252,6 +248,7 @@ func (ml *MergedListeners) AppendTlsListener( ) { parent := tcpFilterChainParent{ gatewayListenerName: query.GenerateRouteKey(listener.Parent, string(listener.Name)), + parentNamespace: listener.Parent.GetNamespace(), routesWithHosts: routeInfos, } tls := listener.TLS @@ -276,7 +273,6 @@ func (ml *MergedListeners) AppendTlsListener( // create a new filter chain for the listener ml.Listeners = append(ml.Listeners, &MergedListener{ name: GenerateListenerName(listener), - gatewayNamespace: ml.GatewayNamespace, port: finalPort, TcpFilterChains: []tcpFilterChain{fc}, listenerReporter: reporter, @@ -301,7 +297,6 @@ func (ml *MergedListeners) translateListeners( type MergedListener struct { name string - gatewayNamespace string port gwv1.PortNumber httpFilterChain *httpFilterChain httpsFilterChains []httpsFilterChain @@ -335,7 +330,7 @@ func (ml *MergedListener) TranslateListener( kctx, ctx, mfc.gatewayListenerName, - ml.gatewayNamespace, + mfc.parentNamespace, queries, reporter, ml.listenerReporter, @@ -352,7 +347,7 @@ func (ml *MergedListener) TranslateListener( // Translate TCP listeners (if any exist) var matchedTcpListeners []ir.TcpIR for _, tfc := range ml.TcpFilterChains { - if tcpListener := tfc.translateTcpFilterChain(kctx, ctx, ml.gatewayNamespace, queries, ml.name, reporter); tcpListener != nil { + if tcpListener := tfc.translateTcpFilterChain(kctx, ctx, tfc.parents.parentNamespace, queries, ml.name, reporter); tcpListener != nil { matchedTcpListeners = append(matchedTcpListeners, *tcpListener) } } @@ -402,7 +397,10 @@ type tcpFilterChain struct { type tcpFilterChainParent struct { gatewayListenerName string - routesWithHosts []*query.RouteInfo + // Although the parent gateway is the same for all listeners, + // they can belong to different listenersets in different namespaces + parentNamespace string + routesWithHosts []*query.RouteInfo } func (tc *tcpFilterChain) translateTcpFilterChain( @@ -678,10 +676,13 @@ func (httpFilterChain *httpFilterChain) translateHttpFilterChain( type httpsFilterChain struct { gatewayListenerName string - sniDomain *gwv1.Hostname - tls *gwv1.ListenerTLSConfig - routesWithHosts []*query.RouteInfo - attachedPolicies ir.AttachedPolicies + // Although the parent gateway is the same for all listeners, + // they can belong to different listenersets in different namespaces + parentNamespace string + sniDomain *gwv1.Hostname + tls *gwv1.ListenerTLSConfig + routesWithHosts []*query.RouteInfo + attachedPolicies ir.AttachedPolicies } func (httpsFilterChain *httpsFilterChain) translateHttpsFilterChain( diff --git a/internal/kgateway/translator/listener/gateway_listener_translator_test.go b/internal/kgateway/translator/listener/gateway_listener_translator_test.go index dc3dd418375..10fbd4f384b 100644 --- a/internal/kgateway/translator/listener/gateway_listener_translator_test.go +++ b/internal/kgateway/translator/listener/gateway_listener_translator_test.go @@ -40,7 +40,12 @@ var ( func lisToIr(l gwv1.Listener) ir.Listener { return ir.Listener{ Listener: l, - Parent: &gwv1.Gateway{}, + Parent: &gwv1.Gateway{ + ObjectMeta: metav1.ObjectMeta{ + Name: "gw", + Namespace: "default", + }, + }, } } @@ -115,9 +120,8 @@ var _ = Describe("Translator TCPRoute Listener", func() { gatewayReporter := statusReporter.Gateway(gateway) listenerReporter = gatewayReporter.Listener(&gwListener) ml = &listener.MergedListeners{ - Listeners: []*listener.MergedListener{}, - Queries: queries, - GatewayNamespace: "default", + Listeners: []*listener.MergedListener{}, + Queries: queries, } }) @@ -609,9 +613,8 @@ var _ = Describe("Translator TCPRoute Listener", func() { // Re-create the MergedListeners with the test reporter to capture status testMl := &listener.MergedListeners{ - Listeners: []*listener.MergedListener{}, - Queries: queries, - GatewayNamespace: "default", + Listeners: []*listener.MergedListener{}, + Queries: queries, } testMl.AppendTcpListener(lisToIr(gwListener), routes, testListenerReporter) testMl.Listeners[0].TranslateListener(krt.TestingDummyContext{}, ctx, nil, testStatusReporter) @@ -664,9 +667,8 @@ var _ = Describe("Translator TCPRoute Listener", func() { gatewayReporter := statusReporter.Gateway(gateway) listenerReporter = gatewayReporter.Listener(&gwListener) ml = &listener.MergedListeners{ - Listeners: []*listener.MergedListener{}, - Queries: queries, - GatewayNamespace: "default", + Listeners: []*listener.MergedListener{}, + Queries: queries, } }) @@ -891,9 +893,8 @@ var _ = Describe("Translator TCPRoute Listener", func() { gatewayReporter := statusReporter.Gateway(gateway) listenerReporter = gatewayReporter.Listener(&gwListener) ml = &listener.MergedListeners{ - Listeners: []*listener.MergedListener{}, - Queries: queries, - GatewayNamespace: "default", + Listeners: []*listener.MergedListener{}, + Queries: queries, } })