From ea1a22f367998daaac8a9227c90e6714399c9391 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Thu, 10 Dec 2020 14:03:41 -0500 Subject: [PATCH] Move loadbalancer code to commons (#688) * Deprecate KubernetesAutoServiceRegistration * Document service registry in kubernetes. Fixes #348 * Move common load balancer code to spring-cloud-kubernetes-commons --- spring-cloud-kubernetes-commons/pom.xml | 4 ++ .../KubernetesLoadBalancerMode.java | 2 +- .../KubernetesLoadBalancerProperties.java | 2 +- .../KubernetesServiceInstanceMapper.java | 67 +++++++++++++++++++ .../KubernetesServicesListSupplier.java | 58 ++++++++++++++++ ...Fabric8LoadBalancerAutoConfiguration.java} | 9 +-- ...bric8LoadBalancerClientConfiguration.java} | 7 +- ...java => Fabric8ServiceInstanceMapper.java} | 60 ++++------------- ....java => Fabric8ServicesListSupplier.java} | 27 ++------ .../main/resources/META-INF/spring.factories | 2 +- ...c8LoadBalancerAutoConfigurationTests.java} | 14 ++-- ...=> Fabric8ServiceInstanceMapperTests.java} | 13 ++-- .../KubernetesServiceListSupplierTests.java | 7 +- 13 files changed, 179 insertions(+), 93 deletions(-) rename {spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8 => spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons}/loadbalancer/KubernetesLoadBalancerMode.java (93%) rename {spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8 => spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons}/loadbalancer/KubernetesLoadBalancerProperties.java (97%) create mode 100644 spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServiceInstanceMapper.java create mode 100644 spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServicesListSupplier.java rename spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/{KubernetesLoadBalancerAutoConfiguration.java => Fabric8LoadBalancerAutoConfiguration.java} (80%) rename spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/{KubernetesLoadBalancerClientConfiguration.java => Fabric8LoadBalancerClientConfiguration.java} (80%) rename spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/{KubernetesServiceInstanceMapper.java => Fabric8ServiceInstanceMapper.java} (59%) rename spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/{KubernetesServicesListSupplier.java => Fabric8ServicesListSupplier.java} (70%) rename spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/{KubernetesLoadBalancerAutoConfigurationTests.java => Fabric8LoadBalancerAutoConfigurationTests.java} (77%) rename spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/{KubernetesServiceInstanceMapperTests.java => Fabric8ServiceInstanceMapperTests.java} (88%) diff --git a/spring-cloud-kubernetes-commons/pom.xml b/spring-cloud-kubernetes-commons/pom.xml index 09d5cc93..3b7f91a8 100644 --- a/spring-cloud-kubernetes-commons/pom.xml +++ b/spring-cloud-kubernetes-commons/pom.xml @@ -30,6 +30,10 @@ spring-boot-configuration-processor true + + org.springframework.cloud + spring-cloud-loadbalancer + org.springframework.cloud spring-cloud-context diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerMode.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesLoadBalancerMode.java similarity index 93% rename from spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerMode.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesLoadBalancerMode.java index c75437ec..93f47ed2 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerMode.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesLoadBalancerMode.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.loadbalancer; +package org.springframework.cloud.kubernetes.commons.loadbalancer; /** * Kubernetes load balancer mode enum. diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerProperties.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesLoadBalancerProperties.java similarity index 97% rename from spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerProperties.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesLoadBalancerProperties.java index 3f64d3b5..1212a504 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerProperties.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesLoadBalancerProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.fabric8.loadbalancer; +package org.springframework.cloud.kubernetes.commons.loadbalancer; import org.springframework.boot.context.properties.ConfigurationProperties; diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServiceInstanceMapper.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServiceInstanceMapper.java new file mode 100644 index 00000000..f77f85cc --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServiceInstanceMapper.java @@ -0,0 +1,67 @@ +/* + * Copyright 2013-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.commons.loadbalancer; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; +import org.springframework.util.StringUtils; + +/** + * @author Ryan Baxter + */ +public interface KubernetesServiceInstanceMapper { + + KubernetesServiceInstance map(T service); + + static String createHost(String serviceName, String namespace, String clusterDomain) { + return String.format("%s.%s.svc.%s", serviceName, StringUtils.hasText(namespace) ? namespace : "default", + clusterDomain); + } + + static boolean isSecure(Map labels, Map annotations, String servicePortName, + Integer servicePort) { + if (labels != null) { + final String securedLabelValue = labels.getOrDefault("secured", "false"); + if (securedLabelValue.equals("true")) { + return true; + } + } + + if (annotations != null) { + final String securedAnnotationValue = annotations.getOrDefault("secured", "false"); + if (securedAnnotationValue.equals("true")) { + return true; + } + } + return (servicePortName != null && servicePortName.endsWith("https")) || servicePort.toString().endsWith("443"); + } + + static Map getMapWithPrefixedKeys(Map map, String prefix) { + if (map == null) { + return new HashMap<>(); + } + if (!StringUtils.hasText(prefix)) { + return map; + } + final Map result = new HashMap<>(); + map.forEach((k, v) -> result.put(prefix + k, v)); + return result; + } + +} diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServicesListSupplier.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServicesListSupplier.java new file mode 100644 index 00000000..a9b485b3 --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/KubernetesServicesListSupplier.java @@ -0,0 +1,58 @@ +/* + * Copyright 2013-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.commons.loadbalancer; + +import java.util.List; + +import reactor.core.publisher.Flux; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.core.env.Environment; + +/** + * Implementation of {@link ServiceInstanceListSupplier} for load balancer in SERVICE + * mode. + * + * @author Piotr Minkowski + */ +public abstract class KubernetesServicesListSupplier implements ServiceInstanceListSupplier { + + protected final Environment environment; + + protected final KubernetesDiscoveryProperties discoveryProperties; + + protected final KubernetesServiceInstanceMapper mapper; + + public KubernetesServicesListSupplier(Environment environment, KubernetesServiceInstanceMapper mapper, + KubernetesDiscoveryProperties discoveryProperties) { + this.environment = environment; + this.discoveryProperties = discoveryProperties; + this.mapper = mapper; + } + + @Override + public String getServiceId() { + return environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); + } + + @Override + public abstract Flux> get(); + +} diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerAutoConfiguration.java b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerAutoConfiguration.java similarity index 80% rename from spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerAutoConfiguration.java rename to spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerAutoConfiguration.java index 4b9ba50b..4394620e 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerAutoConfiguration.java +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerAutoConfiguration.java @@ -20,6 +20,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.kubernetes.commons.ConditionalOnKubernetesEnabled; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.loadbalancer.KubernetesLoadBalancerProperties; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -33,13 +34,13 @@ import org.springframework.context.annotation.Configuration; @EnableConfigurationProperties(KubernetesLoadBalancerProperties.class) @ConditionalOnKubernetesEnabled @ConditionalOnProperty(value = "spring.cloud.kubernetes.loadbalancer.enabled", matchIfMissing = true) -@LoadBalancerClients(defaultConfiguration = KubernetesLoadBalancerClientConfiguration.class) -public class KubernetesLoadBalancerAutoConfiguration { +@LoadBalancerClients(defaultConfiguration = Fabric8LoadBalancerClientConfiguration.class) +public class Fabric8LoadBalancerAutoConfiguration { @Bean - KubernetesServiceInstanceMapper mapper(KubernetesLoadBalancerProperties properties, + Fabric8ServiceInstanceMapper mapper(KubernetesLoadBalancerProperties properties, KubernetesDiscoveryProperties discoveryProperties) { - return new KubernetesServiceInstanceMapper(properties, discoveryProperties); + return new Fabric8ServiceInstanceMapper(properties, discoveryProperties); } } diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerClientConfiguration.java b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerClientConfiguration.java similarity index 80% rename from spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerClientConfiguration.java rename to spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerClientConfiguration.java index 7ed5d385..f66e7286 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerClientConfiguration.java +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerClientConfiguration.java @@ -20,6 +20,7 @@ import io.fabric8.kubernetes.client.KubernetesClient; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.loadbalancer.KubernetesServicesListSupplier; import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; @@ -28,14 +29,14 @@ import org.springframework.core.env.Environment; * * @author Piotr Minkowski */ -public class KubernetesLoadBalancerClientConfiguration { +public class Fabric8LoadBalancerClientConfiguration { @Bean @ConditionalOnProperty(name = "spring.cloud.kubernetes.loadbalancer.mode", havingValue = "SERVICE") KubernetesServicesListSupplier kubernetesServicesListSupplier(Environment environment, - KubernetesClient kubernetesClient, KubernetesServiceInstanceMapper mapper, + KubernetesClient kubernetesClient, Fabric8ServiceInstanceMapper mapper, KubernetesDiscoveryProperties discoveryProperties) { - return new KubernetesServicesListSupplier(environment, kubernetesClient, mapper, discoveryProperties); + return new Fabric8ServicesListSupplier(environment, kubernetesClient, mapper, discoveryProperties); } } diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceInstanceMapper.java b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServiceInstanceMapper.java similarity index 59% rename from spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceInstanceMapper.java rename to spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServiceInstanceMapper.java index 6c78f739..5fe0d5a1 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceInstanceMapper.java +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServiceInstanceMapper.java @@ -25,28 +25,30 @@ import io.fabric8.kubernetes.api.model.ObjectMeta; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.ServicePort; import io.fabric8.kubernetes.client.utils.Utils; -import org.apache.commons.lang.StringUtils; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; +import org.springframework.cloud.kubernetes.commons.loadbalancer.KubernetesLoadBalancerProperties; +import org.springframework.cloud.kubernetes.commons.loadbalancer.KubernetesServiceInstanceMapper; /** * Class for mapping Kubernetes Service object into {@link KubernetesServiceInstance}. * * @author Piotr Minkowski */ -public class KubernetesServiceInstanceMapper { +public class Fabric8ServiceInstanceMapper implements KubernetesServiceInstanceMapper { private final KubernetesLoadBalancerProperties properties; private final KubernetesDiscoveryProperties discoveryProperties; - KubernetesServiceInstanceMapper(KubernetesLoadBalancerProperties properties, + Fabric8ServiceInstanceMapper(KubernetesLoadBalancerProperties properties, KubernetesDiscoveryProperties discoveryProperties) { this.properties = properties; this.discoveryProperties = discoveryProperties; } + @Override public KubernetesServiceInstance map(Service service) { final ObjectMeta meta = service.getMetadata(); final List ports = service.getSpec().getPorts(); @@ -64,8 +66,10 @@ public class KubernetesServiceInstanceMapper { if (port == null) { return null; } - final String host = createHost(service); - final boolean secure = isSecure(service, port); + final String host = KubernetesServiceInstanceMapper.createHost(service.getMetadata().getName(), + service.getMetadata().getNamespace(), properties.getClusterDomain()); + final boolean secure = KubernetesServiceInstanceMapper.isSecure(service.getMetadata().getLabels(), + service.getMetadata().getAnnotations(), port.getName(), port.getPort()); return new KubernetesServiceInstance(meta.getUid(), meta.getName(), host, port.getPort(), getServiceMetadata(service), secure); } @@ -74,55 +78,17 @@ public class KubernetesServiceInstanceMapper { final Map serviceMetadata = new HashMap<>(); KubernetesDiscoveryProperties.Metadata metadataProps = this.discoveryProperties.getMetadata(); if (metadataProps.isAddLabels()) { - Map labelMetadata = getMapWithPrefixedKeys(service.getMetadata().getLabels(), - metadataProps.getLabelsPrefix()); + Map labelMetadata = KubernetesServiceInstanceMapper + .getMapWithPrefixedKeys(service.getMetadata().getLabels(), metadataProps.getLabelsPrefix()); serviceMetadata.putAll(labelMetadata); } if (metadataProps.isAddAnnotations()) { - Map annotationMetadata = getMapWithPrefixedKeys(service.getMetadata().getAnnotations(), - metadataProps.getAnnotationsPrefix()); + Map annotationMetadata = KubernetesServiceInstanceMapper.getMapWithPrefixedKeys( + service.getMetadata().getAnnotations(), metadataProps.getAnnotationsPrefix()); serviceMetadata.putAll(annotationMetadata); } return serviceMetadata; } - private Map getMapWithPrefixedKeys(Map map, String prefix) { - if (map == null) { - return new HashMap<>(); - } - if (!org.springframework.util.StringUtils.hasText(prefix)) { - return map; - } - final Map result = new HashMap<>(); - map.forEach((k, v) -> result.put(prefix + k, v)); - return result; - } - - private boolean isSecure(Service service, ServicePort port) { - if (service.getMetadata().getLabels() != null) { - final String securedLabelValue = service.getMetadata().getLabels().getOrDefault("secured", "false"); - if (securedLabelValue.equals("true")) { - return true; - } - } - - if (service.getMetadata().getAnnotations() != null) { - final String securedAnnotationValue = service.getMetadata().getAnnotations().getOrDefault("secured", - "false"); - if (securedAnnotationValue.equals("true")) { - return true; - } - } - return (port.getName() != null && port.getName().endsWith("https")) - || port.getPort().toString().endsWith("443"); - } - - private String createHost(Service service) { - return String.format("%s.%s.svc.%s", service.getMetadata().getName(), - StringUtils.isNotBlank(service.getMetadata().getNamespace()) ? service.getMetadata().getNamespace() - : "default", - properties.getClusterDomain()); - } - } diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServicesListSupplier.java b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServicesListSupplier.java similarity index 70% rename from spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServicesListSupplier.java rename to spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServicesListSupplier.java index 218cae38..c71b0c9e 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServicesListSupplier.java +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServicesListSupplier.java @@ -21,14 +21,14 @@ import java.util.List; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.client.KubernetesClient; -import org.apache.commons.lang.StringUtils; import reactor.core.publisher.Flux; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.loadbalancer.KubernetesServicesListSupplier; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; -import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.core.env.Environment; +import org.springframework.util.StringUtils; /** * Implementation of {@link ServiceInstanceListSupplier} for load balancer in SERVICE @@ -36,27 +36,14 @@ import org.springframework.core.env.Environment; * * @author Piotr Minkowski */ -public class KubernetesServicesListSupplier implements ServiceInstanceListSupplier { - - private final Environment environment; +public class Fabric8ServicesListSupplier extends KubernetesServicesListSupplier { private final KubernetesClient kubernetesClient; - private final KubernetesDiscoveryProperties discoveryProperties; - - private final KubernetesServiceInstanceMapper mapper; - - KubernetesServicesListSupplier(Environment environment, KubernetesClient kubernetesClient, - KubernetesServiceInstanceMapper mapper, KubernetesDiscoveryProperties discoveryProperties) { - this.environment = environment; + Fabric8ServicesListSupplier(Environment environment, KubernetesClient kubernetesClient, + Fabric8ServiceInstanceMapper mapper, KubernetesDiscoveryProperties discoveryProperties) { + super(environment, mapper, discoveryProperties); this.kubernetesClient = kubernetesClient; - this.discoveryProperties = discoveryProperties; - this.mapper = mapper; - } - - @Override - public String getServiceId() { - return environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); } @Override @@ -68,7 +55,7 @@ public class KubernetesServicesListSupplier implements ServiceInstanceListSuppli services.forEach(service -> result.add(mapper.map(service))); } else { - Service service = StringUtils.isNotBlank(this.kubernetesClient.getNamespace()) + Service service = StringUtils.hasText(this.kubernetesClient.getNamespace()) ? this.kubernetesClient.services().inNamespace(this.kubernetesClient.getNamespace()) .withName(this.getServiceId()).get() : this.kubernetesClient.services().withName(this.getServiceId()).get(); diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/resources/META-INF/spring.factories b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/resources/META-INF/spring.factories index 6b37e4b7..45f45201 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/src/main/resources/META-INF/spring.factories @@ -1,2 +1,2 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.kubernetes.fabric8.loadbalancer.KubernetesLoadBalancerAutoConfiguration +org.springframework.cloud.kubernetes.fabric8.loadbalancer.Fabric8LoadBalancerAutoConfiguration diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerAutoConfigurationTests.java b/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerAutoConfigurationTests.java similarity index 77% rename from spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerAutoConfigurationTests.java rename to spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerAutoConfigurationTests.java index 0d23a34a..20ea0426 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesLoadBalancerAutoConfigurationTests.java +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerAutoConfigurationTests.java @@ -28,7 +28,7 @@ import static org.assertj.core.api.Assertions.assertThat; /** * @author Thomas Vitale */ -class KubernetesLoadBalancerAutoConfigurationTests { +class Fabric8LoadBalancerAutoConfigurationTests { private ConfigurableApplicationContext context; @@ -42,35 +42,35 @@ class KubernetesLoadBalancerAutoConfigurationTests { @Test void kubernetesLoadBalancerWhenKubernetesDisabledAndLoadBalancerDisabled() { setup("spring.cloud.kubernetes.enabled=false", "spring.cloud.kubernetes.loadbalancer.enabled=false"); - assertThat(this.context.getBeanNamesForType(KubernetesServiceInstanceMapper.class)).isEmpty(); + assertThat(this.context.getBeanNamesForType(Fabric8ServiceInstanceMapper.class)).isEmpty(); } @Test void kubernetesLoadBalancerWhenKubernetesDisabledAndLoadBalancerEnabled() { setup("spring.cloud.kubernetes.enabled=false", "spring.cloud.kubernetes.loadbalancer.enabled=true"); - assertThat(this.context.getBeanNamesForType(KubernetesServiceInstanceMapper.class)).isEmpty(); + assertThat(this.context.getBeanNamesForType(Fabric8ServiceInstanceMapper.class)).isEmpty(); } @Test void kubernetesLoadBalancerWhenKubernetesEnabledAndLoadBalancerEnabled() { setup("spring.cloud.kubernetes.enabled=true", "spring.cloud.kubernetes.loadbalancer.enabled=true"); - assertThat(this.context.getBeanNamesForType(KubernetesServiceInstanceMapper.class)).hasSize(1); + assertThat(this.context.getBeanNamesForType(Fabric8ServiceInstanceMapper.class)).hasSize(1); } @Test void kubernetesLoadBalancerWhenKubernetesEnabledAndLoadBalancerDisabled() { setup("spring.cloud.kubernetes.enabled=true", "spring.cloud.kubernetes.loadbalancer.enabled=false"); - assertThat(this.context.getBeanNamesForType(KubernetesServiceInstanceMapper.class)).isEmpty(); + assertThat(this.context.getBeanNamesForType(Fabric8ServiceInstanceMapper.class)).isEmpty(); } @Test void kubernetesLoadBalancerWhenDefaultProperties() { setup(); - assertThat(this.context.getBeanNamesForType(KubernetesServiceInstanceMapper.class)).hasSize(1); + assertThat(this.context.getBeanNamesForType(Fabric8ServiceInstanceMapper.class)).hasSize(1); } private void setup(String... env) { - this.context = new SpringApplicationBuilder(KubernetesLoadBalancerAutoConfiguration.class, + this.context = new SpringApplicationBuilder(Fabric8LoadBalancerAutoConfiguration.class, KubernetesDiscoveryProperties.class).web(org.springframework.boot.WebApplicationType.NONE) .properties(env).run(); } diff --git a/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceInstanceMapperTests.java b/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServiceInstanceMapperTests.java similarity index 88% rename from spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceInstanceMapperTests.java rename to spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServiceInstanceMapperTests.java index c4a0ecea..a0fe172d 100644 --- a/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/KubernetesServiceInstanceMapperTests.java +++ b/spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServiceInstanceMapperTests.java @@ -31,15 +31,16 @@ import org.junit.jupiter.api.Test; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; +import org.springframework.cloud.kubernetes.commons.loadbalancer.KubernetesLoadBalancerProperties; -class KubernetesServiceInstanceMapperTests { +class Fabric8ServiceInstanceMapperTests { @Test public void testMapperSimple() { KubernetesLoadBalancerProperties properties = new KubernetesLoadBalancerProperties(); KubernetesDiscoveryProperties discoveryProperties = new KubernetesDiscoveryProperties(); Service service = buildService("test", "abc", 8080, null, new HashMap<>()); - KubernetesServiceInstance instance = new KubernetesServiceInstanceMapper(properties, discoveryProperties) + KubernetesServiceInstance instance = new Fabric8ServiceInstanceMapper(properties, discoveryProperties) .map(service); Assertions.assertNotNull(instance); Assertions.assertEquals("test", instance.getServiceId()); @@ -55,7 +56,7 @@ class KubernetesServiceInstanceMapperTests { ports.add(new ServicePortBuilder().withPort(8080).withName("web").build()); ports.add(new ServicePortBuilder().withPort(9000).withName("http").build()); Service service = buildService("test", "abc", ports, new HashMap<>()); - KubernetesServiceInstance instance = new KubernetesServiceInstanceMapper(properties, discoveryProperties) + KubernetesServiceInstance instance = new Fabric8ServiceInstanceMapper(properties, discoveryProperties) .map(service); Assertions.assertNotNull(instance); Assertions.assertEquals("test", instance.getServiceId()); @@ -68,7 +69,7 @@ class KubernetesServiceInstanceMapperTests { KubernetesLoadBalancerProperties properties = new KubernetesLoadBalancerProperties(); KubernetesDiscoveryProperties discoveryProperties = new KubernetesDiscoveryProperties(); Service service = buildService("test", "abc", 443, null, new HashMap<>()); - KubernetesServiceInstance instance = new KubernetesServiceInstanceMapper(properties, discoveryProperties) + KubernetesServiceInstance instance = new Fabric8ServiceInstanceMapper(properties, discoveryProperties) .map(service); Assertions.assertNotNull(instance); Assertions.assertEquals("test", instance.getServiceId()); @@ -83,7 +84,7 @@ class KubernetesServiceInstanceMapperTests { List ports = new ArrayList<>(); ports.add(new ServicePortBuilder().withPort(443).build()); Service service = buildService("test", "abc", ports, null, null); - KubernetesServiceInstance instance = new KubernetesServiceInstanceMapper(properties, discoveryProperties) + KubernetesServiceInstance instance = new Fabric8ServiceInstanceMapper(properties, discoveryProperties) .map(service); Assertions.assertNotNull(instance); Assertions.assertEquals("test", instance.getServiceId()); @@ -99,7 +100,7 @@ class KubernetesServiceInstanceMapperTests { labels.put("secured", "true"); labels.put("label1", "123"); Service service = buildService("test", "abc", 8080, null, labels); - KubernetesServiceInstance instance = new KubernetesServiceInstanceMapper(properties, discoveryProperties) + KubernetesServiceInstance instance = new Fabric8ServiceInstanceMapper(properties, discoveryProperties) .map(service); Assertions.assertNotNull(instance); Assertions.assertEquals("test", instance.getServiceId()); 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 7d04ab68..ba8a6a5a 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 @@ -38,6 +38,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; +import org.springframework.cloud.kubernetes.commons.loadbalancer.KubernetesServicesListSupplier; import org.springframework.core.env.Environment; import static org.mockito.ArgumentMatchers.any; @@ -50,7 +51,7 @@ class KubernetesServiceListSupplierTests { Environment environment; @Mock - KubernetesServiceInstanceMapper mapper; + Fabric8ServiceInstanceMapper mapper; @Mock KubernetesClient client; @@ -76,7 +77,7 @@ class KubernetesServiceListSupplierTests { when(this.serviceOperation.inNamespace("test")).thenReturn(namespaceOperation); when(this.namespaceOperation.withName("test-service")).thenReturn(this.serviceResource); when(this.serviceResource.get()).thenReturn(buildService("test-service", 8080)); - KubernetesServicesListSupplier supplier = new KubernetesServicesListSupplier(environment, client, mapper, + KubernetesServicesListSupplier supplier = new Fabric8ServicesListSupplier(environment, client, mapper, new KubernetesDiscoveryProperties()); List instances = supplier.get().blockFirst(); assert instances != null; @@ -95,7 +96,7 @@ class KubernetesServiceListSupplierTests { when(this.multiDeletable.list()).thenReturn(serviceList); KubernetesDiscoveryProperties discoveryProperties = new KubernetesDiscoveryProperties(); discoveryProperties.setAllNamespaces(true); - KubernetesServicesListSupplier supplier = new KubernetesServicesListSupplier(environment, client, mapper, + KubernetesServicesListSupplier supplier = new Fabric8ServicesListSupplier(environment, client, mapper, discoveryProperties); List instances = supplier.get().blockFirst(); assert instances != null;