From 50484cb4b9becbc6a13b36731654309b53ac2ade Mon Sep 17 00:00:00 2001 From: erabii Date: Thu, 16 Mar 2023 19:39:00 +0200 Subject: [PATCH] Fix 513 (#1262) --- .../DefaultKubernetesServiceInstance.java | 5 +++ .../KubernetesDiscoveryClientUtils.java | 6 +++ .../KubernetesDiscoveryClientUtilsTests.java | 41 +++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/DefaultKubernetesServiceInstance.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/DefaultKubernetesServiceInstance.java index f9d4c729..d1236a81 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/DefaultKubernetesServiceInstance.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/DefaultKubernetesServiceInstance.java @@ -116,6 +116,11 @@ public record DefaultKubernetesServiceInstance(String instanceId, String service if (port == -1) { return URI.create(host); } + + // assume an endpoint without ports + if (port == 0) { + return URI.create(scheme + "://" + host); + } return URI.create(scheme + "://" + host + ":" + port); } } diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtils.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtils.java index 29e5a15a..5eadf0b0 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtils.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtils.java @@ -79,6 +79,12 @@ final class KubernetesDiscoveryClientUtils { Service service) { List endpointPorts = endpointSubset.getPorts(); + + if (endpointPorts.size() == 0) { + LOG.debug(() -> "no ports found for service : " + serviceId + ", will return zero"); + return 0; + } + if (endpointPorts.size() == 1) { int port = endpointPorts.get(0).getPort(); LOG.debug(() -> "endpoint ports has a single entry, using port : " + port); diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtilsTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtilsTests.java index c0a002f6..76303e1d 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtilsTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientUtilsTests.java @@ -157,6 +157,23 @@ class KubernetesDiscoveryClientUtilsTests { Assertions.assertTrue(output.getOut().contains("will use primaryPortName : http for service with ID = abc")); } + /** + *
+	 *     - EndpointSubset has no ports.
+	 * 
+ */ + @Test + void testEndpointsPortNoPorts(CapturedOutput output) { + EndpointSubset endpointSubset = new EndpointSubsetBuilder().build(); + String serviceId = "spring-k8s"; + KubernetesDiscoveryProperties properties = KubernetesDiscoveryProperties.DEFAULT; + Service service = new ServiceBuilder().build(); + + Integer port = KubernetesDiscoveryClientUtils.endpointsPort(endpointSubset, serviceId, properties, service); + Assertions.assertEquals(port, 0); + Assertions.assertTrue(output.getOut().contains("no ports found for service : spring-k8s, will return zero")); + } + /** *
 	 *     - EndpointSubset has a single entry in getPorts.
@@ -739,6 +756,30 @@ class KubernetesDiscoveryClientUtilsTests {
 		Assertions.assertNull(defaultInstance.getCluster());
 	}
 
+	@Test
+	void testNoPortsServiceInstance() {
+		Service service = new ServiceBuilder()
+			.withSpec(new ServiceSpecBuilder().withType("ClusterIP").build())
+			.withMetadata(new ObjectMetaBuilder().withUid("123").build()).build();
+
+		EndpointAddress endpointAddress = new EndpointAddressBuilder().withIp("127.0.0.1").build();
+
+		ServiceInstance serviceInstance = KubernetesDiscoveryClientUtils.serviceInstance(null, service,
+			endpointAddress, 0, "my-service", Map.of("a", "b"), "k8s", KubernetesDiscoveryProperties.DEFAULT, null);
+		Assertions.assertTrue(serviceInstance instanceof DefaultKubernetesServiceInstance);
+		DefaultKubernetesServiceInstance defaultInstance = (DefaultKubernetesServiceInstance) serviceInstance;
+		Assertions.assertEquals(defaultInstance.getInstanceId(), "123");
+		Assertions.assertEquals(defaultInstance.getServiceId(), "my-service");
+		Assertions.assertEquals(defaultInstance.getHost(), "127.0.0.1");
+		Assertions.assertEquals(defaultInstance.getScheme(), "http");
+		Assertions.assertEquals(defaultInstance.getPort(), 0);
+		Assertions.assertFalse(defaultInstance.isSecure());
+		Assertions.assertEquals(defaultInstance.getUri().toASCIIString(), "http://127.0.0.1");
+		Assertions.assertEquals(defaultInstance.getMetadata(), Map.of("a", "b"));
+		Assertions.assertEquals(defaultInstance.getNamespace(), "k8s");
+		Assertions.assertNull(defaultInstance.getCluster());
+	}
+
 	private String filterOnK8sNamespaceAndType(Map result) {
 		return result.entrySet().stream().filter(en -> !en.getKey().contains("k8s_namespace"))
 				.filter(en -> !en.getKey().equals("type"))