diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8KubernetesDiscoveryClientUtils.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8KubernetesDiscoveryClientUtils.java index f9c13b9a..9e30f91a 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8KubernetesDiscoveryClientUtils.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8KubernetesDiscoveryClientUtils.java @@ -50,6 +50,8 @@ import org.springframework.core.log.LogAccessor; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.UNSET_PORT_NAME; + /** * @author wind57 */ @@ -199,20 +201,12 @@ final class Fabric8KubernetesDiscoveryClientUtils { static LinkedHashMap endpointSubsetPortsData(EndpointSubset endpointSubset) { LinkedHashMap result = new LinkedHashMap<>(); - List endpointPorts = endpointSubset.getPorts(); - - // this is most probably not a needed if statement, but it preserves the - // previous logic before I refactored the code. In particular, this takes care of - // the fact that an EndpointsPort name could be missing. - if (endpointPorts.size() == 1) { - result.put(endpointPorts.get(0).getName(), endpointPorts.get(0).getPort()); - return result; - } - endpointSubset.getPorts().forEach(port -> { - if (StringUtils.hasText(port.getName())) { - result.put(port.getName(), port.getPort()); - } + // a service is allowed to not set a port name for a single entry. + // two ports without name can not be deployed, as this in an error + String portName = StringUtils.hasText(port.getName()) ? port.getName() : UNSET_PORT_NAME; + Integer portNumber = port.getPort(); + result.put(portName, portNumber); }); return result; } diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8KubernetesDiscoveryClientUtilsTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8KubernetesDiscoveryClientUtilsTests.java index 7199f1bb..6857a6cf 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8KubernetesDiscoveryClientUtilsTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8KubernetesDiscoveryClientUtilsTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.kubernetes.fabric8.discovery; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -36,6 +37,7 @@ import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.mock.env.MockEnvironment; +import static org.springframework.cloud.kubernetes.fabric8.discovery.Fabric8KubernetesDiscoveryClientUtils.endpointSubsetPortsData; import static org.springframework.cloud.kubernetes.fabric8.discovery.Fabric8KubernetesDiscoveryClientUtils.services; /** @@ -310,6 +312,34 @@ class Fabric8KubernetesDiscoveryClientUtilsTests { Assertions.assertEquals(portsData.get("http"), "8081"); } + @Test + void endpointSubsetPortsDataWithoutPorts() { + EndpointSubset endpointSubset = new EndpointSubsetBuilder().build(); + LinkedHashMap result = endpointSubsetPortsData(endpointSubset); + + Assertions.assertEquals(result.size(), 0); + } + + @Test + void endpointSubsetPortsDataSinglePort() { + EndpointSubset endpointSubset = new EndpointSubsetBuilder() + .withPorts(new EndpointPortBuilder().withName("name").withPort(80).build()).build(); + LinkedHashMap result = endpointSubsetPortsData(endpointSubset); + + Assertions.assertEquals(result.size(), 1); + Assertions.assertEquals(result.get("name"), 80); + } + + @Test + void endpointSubsetPortsDataSinglePortNoName() { + EndpointSubset endpointSubset = new EndpointSubsetBuilder() + .withPorts(new EndpointPortBuilder().withPort(80).build()).build(); + LinkedHashMap result = endpointSubsetPortsData(endpointSubset); + + Assertions.assertEquals(result.size(), 1); + Assertions.assertEquals(result.get(""), 80); + } + private void service(String name, String namespace, Map labels) { Service service = new ServiceBuilder().withNewMetadata().withName(name).withLabels(labels) .withNamespace(namespace).and().build();