diff --git a/internal/configs/configurator.go b/internal/configs/configurator.go index 0f449f7db9..0f8aa3ce1e 100644 --- a/internal/configs/configurator.go +++ b/internal/configs/configurator.go @@ -311,6 +311,16 @@ func (cnf *Configurator) AddOrUpdateIngress(ingEx *IngressEx) (Warnings, error) return warnings, nil } +// virtualServerExForHost takes a hostname and returns a VirtualServerEx for the given hostname. +func (cnf *Configurator) virtualServerExForHost(hostname string) *VirtualServerEx { + for _, vsEx := range cnf.virtualServers { + if vsEx.VirtualServer.Spec.Host == hostname { + return vsEx + } + } + return nil +} + // virtualServerForHost takes a hostname and returns a VS for the given hostname. func (cnf *Configurator) virtualServerForHost(hostname string) *conf_v1.VirtualServer { for _, vsEx := range cnf.virtualServers { @@ -321,11 +331,13 @@ func (cnf *Configurator) virtualServerForHost(hostname string) *conf_v1.VirtualS return nil } -// upstreamsForVirtualServer takes VirtualServer and returns a list of associated upstreams. -func (cnf *Configurator) upstreamsForVirtualServer(vs *conf_v1.VirtualServer) []string { +// upstreamsForVirtualServer takes a VirtualServerEx and returns a list of associated upstreams. +func (cnf *Configurator) upstreamsForVirtualServer(vsex *VirtualServerEx) []string { l := nl.LoggerFromContext(cnf.CfgParams.Context) + vs := vsex.VirtualServer + var upstreamNames []string + nl.Debugf(l, "Get upstreamName for vs: %s", vs.Spec.Host) - upstreamNames := make([]string, 0, len(vs.Spec.Upstreams)) virtualServerUpstreamNamer := NewUpstreamNamerForVirtualServer(vs) @@ -334,6 +346,17 @@ func (cnf *Configurator) upstreamsForVirtualServer(vs *conf_v1.VirtualServer) [] nl.Debugf(l, "upstream: %s, upstreamName: %s", u.Name, upstreamName) upstreamNames = append(upstreamNames, upstreamName) } + + for _, vsr := range vsex.VirtualServerRoutes { + upstreamNamer := NewUpstreamNamerForVirtualServerRoute(vs, vsr) + for _, u := range vsr.Spec.Upstreams { + upstreamName := upstreamNamer.GetNameForUpstream(u.Name) + nl.Debugf(l, "upstream: %s, upstreamName: %s", u.Name, upstreamName) + upstreamNames = append(upstreamNames, upstreamName) + + } + } + return upstreamNames } @@ -341,9 +364,9 @@ func (cnf *Configurator) upstreamsForVirtualServer(vs *conf_v1.VirtualServer) [] func (cnf *Configurator) UpstreamsForHost(hostname string) []string { l := nl.LoggerFromContext(cnf.CfgParams.Context) nl.Debugf(l, "Get upstream for host: %s", hostname) - vs := cnf.virtualServerForHost(hostname) - if vs != nil { - return cnf.upstreamsForVirtualServer(vs) + vsex := cnf.virtualServerExForHost(hostname) + if vsex != nil { + return cnf.upstreamsForVirtualServer(vsex) } return nil } diff --git a/internal/configs/configurator_test.go b/internal/configs/configurator_test.go index 0a9c4c437f..27bfcb0885 100644 --- a/internal/configs/configurator_test.go +++ b/internal/configs/configurator_test.go @@ -1563,6 +1563,24 @@ func TestUpstreamsForHost_ReturnsNilForNoVirtualServers(t *testing.T) { } } +func TestUpstreamsForHost_VirtualServerRoutes(t *testing.T) { + t.Parallel() + + tcnf := createTestConfigurator(t) + tcnf.virtualServers = map[string]*VirtualServerEx{ + "vs": validVirtualServerExWithRouteUpstreams, + } + + want := []string{ + "vs_default_cafe-vs_vsr_tea_tea-app_tea", + "vs_default_cafe-vs_vsr_coffee_coffee-app_coffee", + } + got := tcnf.UpstreamsForHost("cafe.example.com") + if !cmp.Equal(want, got) { + t.Error(cmp.Diff(want, got)) + } +} + func TestUpstreamsForHost_DoesNotReturnUpstreamsOnBogusHostname(t *testing.T) { t.Parallel() @@ -1834,6 +1852,55 @@ var ( }, } + validVirtualServerExWithRouteUpstreams = &VirtualServerEx{ + VirtualServerRoutes: []*conf_v1.VirtualServerRoute{ + { + ObjectMeta: meta_v1.ObjectMeta{ + Name: "tea-app", + Namespace: "tea", + }, + Spec: conf_v1.VirtualServerRouteSpec{ + Upstreams: []conf_v1.Upstream{ + { + Name: "tea", + Service: "tea-svc", + }, + }, + }, + }, + { + ObjectMeta: meta_v1.ObjectMeta{ + Name: "coffee-app", + Namespace: "coffee", + }, + Spec: conf_v1.VirtualServerRouteSpec{ + Upstreams: []conf_v1.Upstream{ + { + Name: "coffee", + Service: "coffee-svc", + }, + }, + }, + }, + }, + VirtualServer: &conf_v1.VirtualServer{ + ObjectMeta: meta_v1.ObjectMeta{ + Name: "cafe-vs", + Namespace: "default", + }, + Spec: conf_v1.VirtualServerSpec{ + Host: "cafe.example.com", + Routes: []conf_v1.Route{ + { + Route: "tea/tea", + }, + { + Route: "coffee/coffee", + }, + }, + }, + }, + } validTransportServerExWithUpstreams = &TransportServerEx{ TransportServer: &conf_v1.TransportServer{ ObjectMeta: meta_v1.ObjectMeta{