diff --git a/internal/kube/controller/controller_test.go b/internal/kube/controller/controller_test.go index 34f22c2a7..e571fc2cc 100644 --- a/internal/kube/controller/controller_test.go +++ b/internal/kube/controller/controller_test.go @@ -258,7 +258,7 @@ func TestGeneral(t *testing.T) { resource.DeploymentResource(): f.routerDeployment("skupper-router", "test"), }, expectedRouterConfig: []*RouterConfig{ - f.routerConfig("skupper-router", "test").tcpListener("mylistener", "1024", "", ""), + f.routerConfig("skupper-router", "test").tcpListener("listener.mylistener", "1024", "", ""), }, expectedServices: []*corev1.Service{ f.service("mysvc", "test", f.routerSelector(true), f.servicePort("mylistener", 8080, 1024)), @@ -291,19 +291,19 @@ func TestGeneral(t *testing.T) { "skupper-router", "test", ).tcpListener( - "mylistener", "1024", "mysvc", "", + "listener.mylistener", "1024", "mysvc", "", ).tcpListener( - "mylistener@mypod-1", "*", "mysvc.mypod-1", "", + "listener.mylistener@mypod-1", "*", "mysvc.mypod-1", "", ).tcpListener( - "mylistener@mypod-2", "*", "mysvc.mypod-2", "", + "listener.mylistener@mypod-2", "*", "mysvc.mypod-2", "", ).tcpConnector( - "myconnector@10.1.1.10", "10.1.1.10", "8080", "mysvc", "", + "connector.myconnector@10.1.1.10", "10.1.1.10", "8080", "mysvc", "", ).tcpConnector( - "myconnector@10.1.1.11", "10.1.1.11", "8080", "mysvc", "", + "connector.myconnector@10.1.1.11", "10.1.1.11", "8080", "mysvc", "", ).tcpConnector( - "myconnector@mypod-1", "10.1.1.10", "8080", "mysvc.mypod-1", "", + "connector.myconnector@mypod-1", "10.1.1.10", "8080", "mysvc.mypod-1", "", ).tcpConnector( - "myconnector@mypod-2", "10.1.1.11", "8080", "mysvc.mypod-2", "", + "connector.myconnector@mypod-2", "10.1.1.11", "8080", "mysvc.mypod-2", "", ), }, expectedServices: []*corev1.Service{ @@ -312,6 +312,44 @@ func TestGeneral(t *testing.T) { f.service("mypod-2", "test", f.routerSelector(true), f.servicePortU("mylistener", 8080)), }, }, + { + name: "expose pods by name with same name", + k8sObjects: []runtime.Object{ + f.skupperNetworkStatus("test", f.networkStatusInfo("mysite", "test", nil, map[string]string{"mysvc": "mysvc", "mysvc.mypod-1": "10.1.1.10", "mysvc.mypod-2": "10.1.1.11"}).info()), + f.pod("mypod-1", "test", map[string]string{"app": "foo"}, nil, f.podStatus("10.1.1.10", corev1.PodRunning, f.podCondition(corev1.PodReady, corev1.ConditionTrue))), + f.pod("mypod-2", "test", map[string]string{"app": "foo"}, nil, f.podStatus("10.1.1.11", corev1.PodRunning, f.podCondition(corev1.PodReady, corev1.ConditionTrue))), + }, + skupperObjects: []runtime.Object{ + f.site("mysite", "test", "", false, false), + f.connectorWithExposePodsByName("backend", "test", "mysvc", "app=foo", 8080), + f.listenerWithExposePodsByName("backend", "test", "mysvc", "mysvc", 8080), + }, + waitFunctions: []WaitFunction{ + isConnectorStatusConditionTrue("backend", "test", skupperv2alpha1.CONDITION_TYPE_CONFIGURED), + isListenerStatusConditionTrue("backend", "test", skupperv2alpha1.CONDITION_TYPE_CONFIGURED), + }, + expectedSiteStatuses: []*skupperv2alpha1.Site{ + f.siteStatus("mysite", "test", skupperv2alpha1.StatusPending, "Not Running", f.condition(skupperv2alpha1.CONDITION_TYPE_CONFIGURED, metav1.ConditionTrue, "Ready", "OK")), + }, + expectedDynamicResources: map[schema.GroupVersionResource]*unstructured.Unstructured{ + resource.DeploymentResource(): f.routerDeployment("skupper-router", "test"), + }, + expectedRouterConfig: []*RouterConfig{ + f.routerConfig("skupper-router", "test"). + tcpListener("listener.backend", "1024", "mysvc", ""). + tcpListener("listener.backend@mypod-1", "*", "mysvc.mypod-1", ""). + tcpListener("listener.backend@mypod-2", "*", "mysvc.mypod-2", ""). + tcpConnector("connector.backend@10.1.1.10", "10.1.1.10", "8080", "mysvc", ""). + tcpConnector("connector.backend@10.1.1.11", "10.1.1.11", "8080", "mysvc", ""). + tcpConnector("connector.backend@mypod-1", "10.1.1.10", "8080", "mysvc.mypod-1", ""). + tcpConnector("connector.backend@mypod-2", "10.1.1.11", "8080", "mysvc.mypod-2", ""), + }, + expectedServices: []*corev1.Service{ + f.service("mysvc", "test", f.routerSelector(true), f.servicePort("backend", 8080, 1024)), + f.service("mypod-1", "test", f.routerSelector(true), f.servicePortU("backend", 8080)), + f.service("mypod-2", "test", f.routerSelector(true), f.servicePortU("backend", 8080)), + }, + }, { name: "listener with no site", skupperObjects: []runtime.Object{ @@ -335,7 +373,7 @@ func TestGeneral(t *testing.T) { resource.DeploymentResource(): f.routerDeployment("skupper-router", "test"), }, expectedRouterConfig: []*RouterConfig{ - f.routerConfig("skupper-router", "test").tcpConnector("myconnector@mysvc", "mysvc", "8080", "", ""), + f.routerConfig("skupper-router", "test").tcpConnector("connector.myconnector@mysvc", "mysvc", "8080", "", ""), }, }, { @@ -359,7 +397,7 @@ func TestGeneral(t *testing.T) { resource.DeploymentResource(): f.routerDeployment("skupper-router", "test"), }, expectedRouterConfig: []*RouterConfig{ - f.routerConfig("skupper-router", "test").tcpConnector("myconnector@10.1.1.10", "10.1.1.10", "8080", "", ""), + f.routerConfig("skupper-router", "test").tcpConnector("connector.myconnector@10.1.1.10", "10.1.1.10", "8080", "", ""), }, }, { @@ -394,7 +432,7 @@ func TestGeneral(t *testing.T) { resource.DeploymentResource(): f.routerDeployment("skupper-router", "test"), }, expectedRouterConfig: []*RouterConfig{ - f.routerConfig("skupper-router", "test").tcpConnector("myconnector@10.1.1.10", "10.1.1.10", "8080", "", ""), + f.routerConfig("skupper-router", "test").tcpConnector("connector.myconnector@10.1.1.10", "10.1.1.10", "8080", "", ""), }, }, /* TODO: Fix @@ -486,7 +524,7 @@ func TestGeneral(t *testing.T) { resource.DeploymentResource(): f.routerDeployment("skupper-router", "test"), }, expectedRouterConfig: []*RouterConfig{ - f.routerConfig("skupper-router", "test").tcpListener("mylistener", "1024", "", ""), + f.routerConfig("skupper-router", "test").tcpListener("listener.mylistener", "1024", "", ""), }, expectedServices: []*corev1.Service{ f.serviceWithMetadata(f.service("mysvc", "test", f.routerSelector(true), f.servicePort("mylistener", 8080, 1024)), map[string]string{"acme.com/foo": "bar"}, nil), @@ -1707,6 +1745,11 @@ func (rc *RouterConfig) asConfigMapWithOwner(name string, uid string) *corev1.Co func (rc *RouterConfig) verify(t *testing.T, cm *corev1.ConfigMap) error { config, err := qdr.GetRouterConfigFromConfigMap(cm) assert.Assert(t, err) + for name := range config.Bridges.TcpListeners { + if _, ok := config.Bridges.TcpConnectors[name]; ok { + assert.Assert(t, false, "bridge resource name %q used as both tcpListener and tcpConnector", name) + } + } for key, expected := range rc.config.Addresses { actual, ok := config.Addresses[key] assert.Assert(t, ok, "No address found for %s", key) diff --git a/internal/kube/site/bindings_test.go b/internal/kube/site/bindings_test.go index 1d6ba2c40..0a681f1bf 100644 --- a/internal/kube/site/bindings_test.go +++ b/internal/kube/site/bindings_test.go @@ -284,8 +284,8 @@ func TestBindingAdaptor_updateBridgeConfigForConnector(t *testing.T) { config: qdr.BridgeConfig{ TcpListeners: map[string]qdr.TcpEndpoint{}, TcpConnectors: map[string]qdr.TcpEndpoint{ - "backend@192.168.1.1": qdr.TcpEndpoint{ - Name: "backend@192.168.1.1", + "connector.backend@192.168.1.1": qdr.TcpEndpoint{ + Name: "connector.backend@192.168.1.1", Host: "192.168.1.1", Port: "8080", SiteId: "00000000-0000-0000-0000-000000000001", @@ -325,8 +325,8 @@ func TestBindingAdaptor_updateBridgeConfigForConnector(t *testing.T) { config: qdr.BridgeConfig{ TcpListeners: map[string]qdr.TcpEndpoint{}, TcpConnectors: map[string]qdr.TcpEndpoint{ - "backend@10.244.0.9": qdr.TcpEndpoint{ - Name: "backend@10.244.0.9", + "connector.backend@10.244.0.9": qdr.TcpEndpoint{ + Name: "connector.backend@10.244.0.9", Host: "10.244.0.9", Port: "0", SiteId: "00000000-0000-0000-0000-000000000001", @@ -591,9 +591,8 @@ func TestBindingAdaptor_updateBridgeConfigForListener(t *testing.T) { expected: expected{ config: qdr.BridgeConfig{ TcpListeners: map[string]qdr.TcpEndpoint{ - "backend": qdr.TcpEndpoint{ - - Name: "backend", + "listener.backend": qdr.TcpEndpoint{ + Name: "listener.backend", Port: "1024", Address: "backend", SiteId: "00000000-0000-0000-0000-000000000001", diff --git a/internal/kube/site/per_target_listener.go b/internal/kube/site/per_target_listener.go index d7a151e78..08d325e9e 100644 --- a/internal/kube/site/per_target_listener.go +++ b/internal/kube/site/per_target_listener.go @@ -130,7 +130,7 @@ func (p *PerTargetListener) updateBridgeConfig(siteId string, config *qdr.Bridge for target, port := range p.targets { if p.definition.Spec.Type == "tcp" || p.definition.Spec.Type == "" { if config.AddTcpListener(qdr.TcpEndpoint{ - Name: p.definition.Name + "@" + target, + Name: qdr.TcpListenerNamePrefix + p.definition.Name + "@" + target, SiteId: siteId, Port: strconv.Itoa(port), Address: p.address(target), diff --git a/internal/qdr/qdr.go b/internal/qdr/qdr.go index 37159f409..0408dfa7e 100644 --- a/internal/qdr/qdr.go +++ b/internal/qdr/qdr.go @@ -33,6 +33,11 @@ type RouterConfigHandler interface { type TcpEndpointMap map[string]TcpEndpoint +const ( + TcpListenerNamePrefix = "listener." + TcpConnectorNamePrefix = "connector." +) + type BridgeConfig struct { TcpListeners TcpEndpointMap TcpConnectors TcpEndpointMap @@ -1190,7 +1195,7 @@ func GetRouterConfigForHeadlessProxy(definition types.ServiceInterface, siteId s for iPort, ePort := range ports { address := fmt.Sprintf("%s-%s:%d", definition.Address, "${POD_ID}", iPort) if definition.IsOfLocalOrigin() { - name := fmt.Sprintf("egress:%d", ePort) + name := TcpConnectorNamePrefix + fmt.Sprintf("egress:%d", ePort) host := definition.Headless.Name + "-${POD_ID}." + definition.Address + "." + namespace // in the originating site, just have egress bindings switch definition.Protocol { @@ -1205,7 +1210,7 @@ func GetRouterConfigForHeadlessProxy(definition types.ServiceInterface, siteId s default: } } else { - name := fmt.Sprintf("ingress:%d", ePort) + name := TcpListenerNamePrefix + fmt.Sprintf("ingress:%d", ePort) // in all other sites, just have ingress bindings switch definition.Protocol { case "tcp": diff --git a/internal/site/bindings_test.go b/internal/site/bindings_test.go index fd4b75de9..415351151 100644 --- a/internal/site/bindings_test.go +++ b/internal/site/bindings_test.go @@ -60,8 +60,8 @@ func TestBindings_Apply(t *testing.T) { }, expected: expected{ tcpListeners: qdr.TcpEndpointMap{ - "listener1": { - Name: "listener1", + "listener.listener1": { + Name: "listener.listener1", Host: "10.10.10.1", Port: "9090", Address: "echo:9090", @@ -101,8 +101,8 @@ func TestBindings_Apply(t *testing.T) { expected: expected{ tcpListeners: qdr.TcpEndpointMap{}, tcpConnectors: qdr.TcpEndpointMap{ - "connector1@10.10.10.1": { - Name: "connector1@10.10.10.1", + "connector.connector1@10.10.10.1": { + Name: "connector.connector1@10.10.10.1", Host: "10.10.10.1", Port: "9090", Address: "echo:9090", @@ -120,8 +120,8 @@ func TestBindings_Apply(t *testing.T) { config: &qdr.RouterConfig{ Bridges: qdr.BridgeConfig{ TcpListeners: map[string]qdr.TcpEndpoint{ - "listener1": qdr.TcpEndpoint{ - Name: "listener1", + "listener.listener1": qdr.TcpEndpoint{ + Name: "listener.listener1", Host: "10.10.10.1", Port: "9090", SiteId: "site-1", @@ -146,8 +146,8 @@ func TestBindings_Apply(t *testing.T) { Bridges: qdr.BridgeConfig{ TcpListeners: map[string]qdr.TcpEndpoint{}, TcpConnectors: map[string]qdr.TcpEndpoint{ - "connector1": qdr.TcpEndpoint{ - Name: "connector1", + "connector.connector1@10.10.10.1": qdr.TcpEndpoint{ + Name: "connector.connector1@10.10.10.1", Host: "10.10.10.1", Port: "9090", SiteId: "site-1", @@ -192,8 +192,8 @@ func TestBindings_Apply(t *testing.T) { }, expected: expected{ tcpListeners: qdr.TcpEndpointMap{ - "listener1": { - Name: "listener1", + "listener.listener1": { + Name: "listener.listener1", Host: "10.10.10.1", Port: "9090", Address: "echo:9090", @@ -243,8 +243,8 @@ func TestBindings_Apply(t *testing.T) { expected: expected{ tcpListeners: qdr.TcpEndpointMap{}, tcpConnectors: qdr.TcpEndpointMap{ - "connector1@10.10.10.1": { - Name: "connector1@10.10.10.1", + "connector.connector1@10.10.10.1": { + Name: "connector.connector1@10.10.10.1", Host: "10.10.10.1", Port: "9090", Address: "echo:9090", @@ -294,8 +294,8 @@ func TestBindings_Apply(t *testing.T) { expected: expected{ tcpListeners: qdr.TcpEndpointMap{}, tcpConnectors: qdr.TcpEndpointMap{ - "connector1@10.10.10.1": { - Name: "connector1@10.10.10.1", + "connector.connector1@10.10.10.1": { + Name: "connector.connector1@10.10.10.1", Host: "10.10.10.1", Port: "9090", Address: "echo:9090", @@ -350,16 +350,16 @@ func TestBindings_Apply(t *testing.T) { expected: expected{ tcpListeners: qdr.TcpEndpointMap{}, tcpConnectors: qdr.TcpEndpointMap{ - "connector1@11.5.6.21": { - Name: "connector1@11.5.6.21", + "connector.connector1@11.5.6.21": { + Name: "connector.connector1@11.5.6.21", Host: "11.5.6.21", Port: "9090", Address: "echo:9090", SiteId: "site-1", ProcessID: "pod1", }, - "connector1@11.5.6.22": { - Name: "connector1@11.5.6.22", + "connector.connector1@11.5.6.22": { + Name: "connector.connector1@11.5.6.22", Host: "11.5.6.22", Port: "9090", Address: "echo:9090", @@ -399,8 +399,8 @@ func TestBindings_Apply(t *testing.T) { }, expected: expected{ tcpListeners: qdr.TcpEndpointMap{ - "listener1": { - Name: "listener1", + "listener.listener1": { + Name: "listener.listener1", Host: "my-host", Port: "5678", Address: "echo:9090", @@ -440,8 +440,8 @@ func TestBindings_Apply(t *testing.T) { }, expected: expected{ tcpListeners: qdr.TcpEndpointMap{ - "listener1": { - Name: "listener1", + "listener.listener1": { + Name: "listener.listener1", Host: "10.10.10.1", Port: "9090", Address: "foo", @@ -482,8 +482,8 @@ func TestBindings_Apply(t *testing.T) { expected: expected{ tcpListeners: qdr.TcpEndpointMap{}, tcpConnectors: qdr.TcpEndpointMap{ - "connector1@10.10.10.1": { - Name: "connector1@10.10.10.1", + "connector.connector1@10.10.10.1": { + Name: "connector.connector1@10.10.10.1", Host: "10.10.10.1", Port: "9090", Address: "foo", diff --git a/internal/site/connector.go b/internal/site/connector.go index f6709f897..f59ddd831 100644 --- a/internal/site/connector.go +++ b/internal/site/connector.go @@ -9,17 +9,17 @@ import ( func UpdateBridgeConfigForConnector(siteId string, connector *skupperv2alpha1.Connector, config *qdr.BridgeConfig) { if connector.Spec.Host != "" { - updateBridgeConfigForConnector(connector.Name+"@"+connector.Spec.Host, siteId, connector, connector.Spec.Host, "", connector.Spec.RoutingKey, config) + updateBridgeConfigForConnector(qdr.TcpConnectorNamePrefix+connector.Name+"@"+connector.Spec.Host, siteId, connector, connector.Spec.Host, "", connector.Spec.RoutingKey, config) } } func UpdateBridgeConfigForConnectorToPod(siteId string, connector *skupperv2alpha1.Connector, pod skupperv2alpha1.PodDetails, addQualifiedAddress bool, config *qdr.BridgeConfig) bool { updated := false - if updateBridgeConfigForConnector(connector.Name+"@"+pod.IP, siteId, connector, pod.IP, pod.UID, connector.Spec.RoutingKey, config) { + if updateBridgeConfigForConnector(qdr.TcpConnectorNamePrefix+connector.Name+"@"+pod.IP, siteId, connector, pod.IP, pod.UID, connector.Spec.RoutingKey, config) { updated = true } if addQualifiedAddress { - if updateBridgeConfigForConnector(connector.Name+"@"+pod.Name, siteId, connector, pod.IP, pod.UID, connector.Spec.RoutingKey+"."+pod.Name, config) { + if updateBridgeConfigForConnector(qdr.TcpConnectorNamePrefix+connector.Name+"@"+pod.Name, siteId, connector, pod.IP, pod.UID, connector.Spec.RoutingKey+"."+pod.Name, config) { updated = true } } diff --git a/internal/site/listener.go b/internal/site/listener.go index 11a1ed206..e0426704f 100644 --- a/internal/site/listener.go +++ b/internal/site/listener.go @@ -12,7 +12,7 @@ func UpdateBridgeConfigForListener(siteId string, listener *skupperv2alpha1.List } func UpdateBridgeConfigForListenerWithHostAndPort(siteId string, listener *skupperv2alpha1.Listener, host string, port int, config *qdr.BridgeConfig) { - name := listener.Name + name := qdr.TcpListenerNamePrefix + listener.Name if listener.Spec.Type == "tcp" || listener.Spec.Type == "" { config.AddTcpListener(qdr.TcpEndpoint{ Name: name,