This commit is contained in:
erabii
2023-03-16 19:39:00 +02:00
committed by GitHub
parent 392f516a7a
commit 50484cb4b9
3 changed files with 52 additions and 0 deletions

View File

@@ -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);
}
}

View File

@@ -79,6 +79,12 @@ final class KubernetesDiscoveryClientUtils {
Service service) {
List<EndpointPort> 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);

View File

@@ -157,6 +157,23 @@ class KubernetesDiscoveryClientUtilsTests {
Assertions.assertTrue(output.getOut().contains("will use primaryPortName : http for service with ID = abc"));
}
/**
* <pre>
* - EndpointSubset has no ports.
* </pre>
*/
@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"));
}
/**
* <pre>
* - 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<String, String> result) {
return result.entrySet().stream().filter(en -> !en.getKey().contains("k8s_namespace"))
.filter(en -> !en.getKey().equals("type"))