diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesServiceInstance.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesServiceInstance.java index afa78de6..c1d814c8 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesServiceInstance.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesServiceInstance.java @@ -143,6 +143,10 @@ public class KubernetesServiceInstance implements ServiceInstance { } private URI createUri(String scheme, String host, int port) { + // assume an endpoint without ports + if (port == 0) { + return URI.create(scheme + COLON + DSL + host); + } return URI.create(scheme + COLON + DSL + host + COLON + port); } diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java index 36b6cdea..3541a385 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java @@ -218,6 +218,12 @@ public class KubernetesDiscoveryClient implements DiscoveryClient { private int findEndpointPort(EndpointSubset s, String serviceId, String primaryPortName) { List endpointPorts = s.getPorts(); + + if (endpointPorts.size() == 0) { + log.debug("no ports found for service : " + serviceId + ", will return zero"); + return 0; + } + if (endpointPorts.size() == 1) { return endpointPorts.get(0).getPort(); } diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java index 42ad1ddb..8a7e0a70 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java @@ -467,4 +467,33 @@ public class KubernetesDiscoveryClientTest { .hasSize(1); } + @Test + public void instanceWithoutPorts() { + Map labels = new HashMap<>(); + + Endpoints endPoint1 = new EndpointsBuilder().withNewMetadata().withName("endpoint5").withNamespace("test") + .withLabels(labels).endMetadata().addNewSubset().addNewAddress().withIp("ip1").withNewTargetRef() + .withUid("130").endTargetRef().endAddress().endSubset().build(); + + mockClient.endpoints().inNamespace("test").create(endPoint1); + + Service service = new ServiceBuilder().withNewMetadata().withName("endpoint5").withNamespace("test") + .withLabels(labels).withAnnotations(labels).endMetadata().build(); + + mockClient.services().inNamespace("test").create(service); + + final KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(); + + final DiscoveryClient discoveryClient = new KubernetesDiscoveryClient(mockClient, properties, + KubernetesClient::services, new ServicePortSecureResolver(properties)); + + final List instances = discoveryClient.getInstances("endpoint5"); + + // We're returning the first discovered port to not change previous behaviour + assertThat(instances).hasSize(1).filteredOn(s -> s.getHost().equals("ip1") && !s.isSecure()).hasSize(1) + .filteredOn(s -> s.getUri().toASCIIString().equals("http://ip1")) + .filteredOn(s -> s.getInstanceId().equals("130")).hasSize(1).filteredOn(s -> 0 == s.getPort()) + .hasSize(1); + } + } diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceListSupplierTests.java b/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceListSupplierTests.java index b3ce577a..5ab4e60b 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceListSupplierTests.java +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceListSupplierTests.java @@ -68,7 +68,7 @@ class KubernetesServiceListSupplierTests { @Test void testPositiveMatch() { when(environment.getProperty("loadbalancer.client.name")).thenReturn("test-service"); - when(mapper.map(any(Service.class))).thenReturn(new KubernetesServiceInstance("", "", "", 0, null, false)); + when(mapper.map(any(Service.class))).thenReturn(new KubernetesServiceInstance("", "", "", 8080, null, false)); when(this.client.getNamespace()).thenReturn("test"); when(this.client.services()).thenReturn(this.serviceOperation); when(this.serviceOperation.inNamespace("test")).thenReturn(namespaceOperation); @@ -84,7 +84,7 @@ class KubernetesServiceListSupplierTests { @Test void testPositiveMatchAllNamespaces() { when(environment.getProperty("loadbalancer.client.name")).thenReturn("test-service"); - when(mapper.map(any(Service.class))).thenReturn(new KubernetesServiceInstance("", "", "", 0, null, false)); + when(mapper.map(any(Service.class))).thenReturn(new KubernetesServiceInstance("", "", "", 8080, null, false)); when(this.client.services()).thenReturn(this.serviceOperation); when(this.serviceOperation.inAnyNamespace()).thenReturn(this.multiDeletable); when(this.multiDeletable.withField("metadata.name", "test-service")).thenReturn(this.multiDeletable);