diff --git a/pom.xml b/pom.xml index d8402324..ee635a5a 100644 --- a/pom.xml +++ b/pom.xml @@ -93,7 +93,8 @@ spring-cloud-kubernetes-client-config spring-cloud-kubernetes-fabric8-autoconfig spring-cloud-kubernetes-fabric8-config - spring-cloud-kubernetes-discovery + spring-cloud-kubernetes-fabric8-discovery + spring-cloud-kubernetes-client-discovery spring-cloud-starter-kubernetes spring-cloud-starter-kubernetes-config spring-cloud-starter-kubernetes-all diff --git a/spring-cloud-kubernetes-client-autoconfig/pom.xml b/spring-cloud-kubernetes-client-autoconfig/pom.xml index 0a60ebab..84c54be0 100644 --- a/spring-cloud-kubernetes-client-autoconfig/pom.xml +++ b/spring-cloud-kubernetes-client-autoconfig/pom.xml @@ -24,6 +24,10 @@ io.kubernetes client-java-extended + + io.kubernetes + client-java-spring-integration + org.springframework.boot spring-boot-actuator-autoconfigure diff --git a/spring-cloud-kubernetes-client-autoconfig/src/main/java/org/springframework/cloud/kubernetes/client/KubernetesClientAutoConfiguration.java b/spring-cloud-kubernetes-client-autoconfig/src/main/java/org/springframework/cloud/kubernetes/client/KubernetesClientAutoConfiguration.java index 732bf4b6..d4c04a0d 100644 --- a/spring-cloud-kubernetes-client-autoconfig/src/main/java/org/springframework/cloud/kubernetes/client/KubernetesClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-autoconfig/src/main/java/org/springframework/cloud/kubernetes/client/KubernetesClientAutoConfiguration.java @@ -46,10 +46,16 @@ public class KubernetesClientAutoConfiguration { @Bean @ConditionalOnMissingBean - public CoreV1Api coreApi() throws IOException { + public ApiClient apiClient() throws IOException { ApiClient apiClient = kubernetesApiClient(); io.kubernetes.client.openapi.Configuration.setDefaultApiClient(apiClient); - return new CoreV1Api(); + return apiClient; + } + + @Bean + @ConditionalOnMissingBean + public CoreV1Api coreApi(ApiClient apiClient) throws IOException { + return new CoreV1Api(apiClient); } @Bean diff --git a/spring-cloud-kubernetes-client-autoconfig/src/test/java/org/springframework/cloud/kubernetes/client/profile/KubernetesClientProfileEnvironmentPostProcessorNoProfileTests.java b/spring-cloud-kubernetes-client-autoconfig/src/test/java/org/springframework/cloud/kubernetes/client/profile/KubernetesClientProfileEnvironmentPostProcessorNoProfileTests.java index e820703e..ccdb9ff2 100644 --- a/spring-cloud-kubernetes-client-autoconfig/src/test/java/org/springframework/cloud/kubernetes/client/profile/KubernetesClientProfileEnvironmentPostProcessorNoProfileTests.java +++ b/spring-cloud-kubernetes-client-autoconfig/src/test/java/org/springframework/cloud/kubernetes/client/profile/KubernetesClientProfileEnvironmentPostProcessorNoProfileTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.kubernetes.client.profile; +import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.apis.CoreV1Api; import org.junit.jupiter.api.Test; @@ -40,6 +41,9 @@ class KubernetesClientProfileEnvironmentPostProcessorNoProfileTests { @MockBean CoreV1Api coreV1Api; + @MockBean + ApiClient apiClient; + @Test void whenNoKubernetesEnvironmentAndNoApiAccessThenNoProfileEnabled() { diff --git a/spring-cloud-kubernetes-client-autoconfig/src/test/java/org/springframework/cloud/kubernetes/client/profile/KubernetesClientProfileEnvironmentPostProcessorTests.java b/spring-cloud-kubernetes-client-autoconfig/src/test/java/org/springframework/cloud/kubernetes/client/profile/KubernetesClientProfileEnvironmentPostProcessorTests.java index 3953dead..d38294a7 100644 --- a/spring-cloud-kubernetes-client-autoconfig/src/test/java/org/springframework/cloud/kubernetes/client/profile/KubernetesClientProfileEnvironmentPostProcessorTests.java +++ b/spring-cloud-kubernetes-client-autoconfig/src/test/java/org/springframework/cloud/kubernetes/client/profile/KubernetesClientProfileEnvironmentPostProcessorTests.java @@ -16,6 +16,7 @@ package org.springframework.cloud.kubernetes.client.profile; +import io.kubernetes.client.openapi.ApiClient; import io.kubernetes.client.openapi.apis.CoreV1Api; import org.junit.jupiter.api.Test; @@ -43,6 +44,9 @@ class KubernetesClientProfileEnvironmentPostProcessorTests { @MockBean CoreV1Api coreV1Api; + @MockBean + ApiClient apiClient; + @Test void whenKubernetesEnvironmentAndNoApiAccessThenProfileEnabled() { assertThat(environment.getActiveProfiles()).contains(KUBERNETES_PROFILE); diff --git a/spring-cloud-kubernetes-client-discovery/pom.xml b/spring-cloud-kubernetes-client-discovery/pom.xml new file mode 100644 index 00000000..8123cb5b --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/pom.xml @@ -0,0 +1,61 @@ + + + + spring-cloud-kubernetes + org.springframework.cloud + 2.0.0-SNAPSHOT + + 4.0.0 + + spring-cloud-kubernetes-client-discovery + Spring Cloud Kubernetes :: Kubernetes Client Discovery + + + + org.springframework.cloud + spring-cloud-kubernetes-client-autoconfig + ${project.version} + + + org.springframework.cloud + spring-cloud-commons + ${spring-cloud-commons.version} + + + org.springframework.boot + spring-boot-actuator + true + + + org.springframework.boot + spring-boot-autoconfigure + true + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + test + + + org.springframework.boot + spring-boot-starter-web + test + + + org.springframework.cloud + spring-cloud-config-client + test + + + + + diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnKubernetesDiscoveryEnabled.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnKubernetesDiscoveryEnabled.java new file mode 100644 index 00000000..bb0f9a07 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnKubernetesDiscoveryEnabled.java @@ -0,0 +1,35 @@ +/* + * Copyright 2019-2019 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.client.discovery; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@ConditionalOnProperty(value = "spring.cloud.kubernetes.discovery.enabled", matchIfMissing = true) +public @interface ConditionalOnKubernetesDiscoveryEnabled { + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientAutoConfiguration.java new file mode 100644 index 00000000..60992f26 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientAutoConfiguration.java @@ -0,0 +1,101 @@ +/* + * Copyright 2013-2019 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.client.discovery; + +import io.kubernetes.client.informer.SharedInformer; +import io.kubernetes.client.informer.SharedInformerFactory; +import io.kubernetes.client.informer.cache.Lister; +import io.kubernetes.client.openapi.ApiClient; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1EndpointsList; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServiceList; +import io.kubernetes.client.spring.extended.controller.KubernetesInformerFactoryProcessor; +import io.kubernetes.client.spring.extended.controller.annotation.GroupVersionResource; +import io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformer; +import io.kubernetes.client.spring.extended.controller.annotation.KubernetesInformers; + +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.cloud.client.CommonsClientAutoConfiguration; +import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled; +import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; +import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration; +import org.springframework.cloud.kubernetes.client.discovery.gson.EndpointsTrimmingStrategy; +import org.springframework.cloud.kubernetes.client.discovery.gson.ServiceTrimmingStrategy; +import org.springframework.cloud.kubernetes.commons.KubernetesClientProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration(proxyBeanMethods = false) +@ConditionalOnKubernetesDiscoveryEnabled +@AutoConfigureBefore({ SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class }) +@AutoConfigureAfter({ KubernetesClientAutoConfiguration.class }) +@EnableConfigurationProperties(KubernetesDiscoveryProperties.class) +public class KubernetesDiscoveryClientAutoConfiguration { + + @Configuration(proxyBeanMethods = false) + @ConditionalOnBlockingDiscoveryEnabled + public static class KubernetesInformerDiscoveryConfiguration { + + @Bean + @ConditionalOnMissingBean + public KubernetesInformerFactoryProcessor kubernetesInformerFactoryProcessor() { + return new KubernetesInformerFactoryProcessor(); + } + + @Bean + @ConditionalOnMissingBean + public CatalogSharedInformerFactory catalogSharedInformerFactory(ApiClient apiClient) { + apiClient.getJSON() + .setGson(apiClient.getJSON().getGson().newBuilder() + .addDeserializationExclusionStrategy(new ServiceTrimmingStrategy()) + .addDeserializationExclusionStrategy(new EndpointsTrimmingStrategy()).create()); + return new CatalogSharedInformerFactory(); + } + + @Bean + @ConditionalOnMissingBean + public KubernetesInformerDiscoveryClient kubernetesInformerDiscoveryClient( + KubernetesClientProperties kubernetesClientProperties, + CatalogSharedInformerFactory sharedInformerFactory, Lister serviceLister, + Lister endpointsLister, SharedInformer serviceInformer, + SharedInformer endpointsInformer, KubernetesDiscoveryProperties properties) { + return new KubernetesInformerDiscoveryClient(kubernetesClientProperties.getNamespace(), + sharedInformerFactory, serviceLister, endpointsLister, serviceInformer, endpointsInformer, + properties); + } + + @KubernetesInformers({ + @KubernetesInformer(apiTypeClass = V1Service.class, apiListTypeClass = V1ServiceList.class, + groupVersionResource = @GroupVersionResource(apiGroup = "", apiVersion = "v1", + resourcePlural = "services")), + @KubernetesInformer(apiTypeClass = V1Endpoints.class, apiListTypeClass = V1EndpointsList.class, + groupVersionResource = @GroupVersionResource(apiGroup = "", apiVersion = "v1", + resourcePlural = "endpoints")) }) + class CatalogSharedInformerFactory extends SharedInformerFactory { + + // TODO: optimization to ease memory pressure from continuous list&watch. + + } + + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java new file mode 100644 index 00000000..656750b7 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java @@ -0,0 +1,29 @@ +/* + * Copyright 2013-2019 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.client.discovery; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration(proxyBeanMethods = false) +@ConditionalOnProperty("spring.cloud.config.discovery.enabled") +@Import({ KubernetesClientAutoConfiguration.class, KubernetesDiscoveryClientAutoConfiguration.class }) +public class KubernetesDiscoveryClientConfigClientBootstrapConfiguration { + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java new file mode 100644 index 00000000..ac3fa8e6 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClient.java @@ -0,0 +1,163 @@ +/* + * Copyright 2013-2019 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.client.discovery; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import io.kubernetes.client.extended.wait.Wait; +import io.kubernetes.client.informer.SharedInformer; +import io.kubernetes.client.informer.SharedInformerFactory; +import io.kubernetes.client.informer.cache.Lister; +import io.kubernetes.client.openapi.models.V1EndpointPort; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1Service; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; +import org.springframework.util.Assert; + +public class KubernetesInformerDiscoveryClient implements DiscoveryClient, InitializingBean { + + private static final Log log = LogFactory.getLog(KubernetesInformerDiscoveryClient.class); + + private final SharedInformerFactory sharedInformerFactory; + + private final Lister serviceLister; + + private final Supplier informersReadyFunc; + + private final Lister endpointsLister; + + private final KubernetesDiscoveryProperties properties; + + private final String namespace; + + public KubernetesInformerDiscoveryClient(String namespace, SharedInformerFactory sharedInformerFactory, + Lister serviceLister, Lister endpointsLister, + SharedInformer serviceInformer, SharedInformer endpointsInformer, + KubernetesDiscoveryProperties properties) { + this.namespace = namespace; + this.sharedInformerFactory = sharedInformerFactory; + + this.serviceLister = serviceLister; + this.endpointsLister = endpointsLister; + this.informersReadyFunc = () -> serviceInformer.hasSynced() && endpointsInformer.hasSynced(); + + this.properties = properties; + } + + @Override + public String description() { + return "Kubernetes Client Discovery"; + } + + @Override + public List getInstances(String serviceId) { + Assert.notNull(serviceId, "[Assertion failed] - the object argument must not be null"); + + V1Service service = properties.isAllNamespaces() ? this.serviceLister.list().stream() + .filter(svc -> serviceId.equals(svc.getMetadata().getName())).findFirst().orElse(null) + : this.serviceLister.namespace(this.namespace).get(serviceId); + if (service == null) { + // no such service present in the cluster + return new ArrayList<>(); + } + + Map svcMetadata = new HashMap<>(); + if (this.properties.getMetadata() != null) { + if (this.properties.getMetadata().isAddLabels()) { + if (service.getMetadata().getLabels() != null) { + String labelPrefix = this.properties.getMetadata().getLabelsPrefix() != null + ? this.properties.getMetadata().getLabelsPrefix() : ""; + service.getMetadata().getLabels().entrySet().stream() + .filter(e -> e.getKey().startsWith(labelPrefix)) + .forEach(e -> svcMetadata.put(e.getKey(), e.getValue())); + } + } + if (this.properties.getMetadata().isAddAnnotations()) { + if (service.getMetadata().getAnnotations() != null) { + String annotationPrefix = this.properties.getMetadata().getAnnotationsPrefix() != null + ? this.properties.getMetadata().getAnnotationsPrefix() : ""; + service.getMetadata().getAnnotations().entrySet().stream() + .filter(e -> e.getKey().startsWith(annotationPrefix)) + .forEach(e -> svcMetadata.put(e.getKey(), e.getValue())); + } + } + } + + V1Endpoints ep = this.endpointsLister.namespace(service.getMetadata().getNamespace()) + .get(service.getMetadata().getName()); + if (ep == null) { + // no available endpoints in the cluster + return new ArrayList<>(); + } + return ep.getSubsets().stream().flatMap(subset -> { + Map metadata = new HashMap<>(svcMetadata); + if (this.properties.getMetadata() != null && this.properties.getMetadata().isAddPorts()) { + subset.getPorts().stream().forEach(p -> metadata.put(p.getName(), Integer.toString(p.getPort()))); + } + V1EndpointPort port = subset.getPorts() != null && subset.getPorts().size() == 1 ? subset.getPorts().get(0) + : subset.getPorts().stream() + .filter(p -> this.properties.getPrimaryPortName().equalsIgnoreCase(p.getName())).findFirst() + .orElseThrow(IllegalStateException::new); + return subset.getAddresses().stream() + .map(addr -> new KubernetesServiceInstance( + addr.getTargetRef() != null ? addr.getTargetRef().getUid() : "", serviceId, addr.getIp(), + port.getPort(), metadata, false)); + }).collect(Collectors.toList()); + } + + @Override + public List getServices() { + List services = this.properties.isAllNamespaces() ? this.serviceLister.list() + : this.serviceLister.namespace(this.namespace).list(); + return services.stream().map(s -> s.getMetadata().getName()).collect(Collectors.toList()); + } + + @Override + public void afterPropertiesSet() throws Exception { + this.sharedInformerFactory.startAllRegisteredInformers(); + if (!Wait.poll(Duration.ofSeconds(1), Duration.ofSeconds(this.properties.getCacheLoadingTimeoutSeconds()), + () -> { + log.info("Waiting for the cache of informers to be fully loaded.."); + return this.informersReadyFunc.get(); + })) { + if (this.properties.isWaitCacheReady()) { + throw new IllegalStateException( + "Timeout waiting for informers cache to be ready, is the kubernetes service up?"); + } + else { + log.warn( + "Timeout waiting for informers cache to be ready, ignoring the failure because waitForInformerCacheReady property is false"); + } + } + log.info("Cache fully loaded (total " + serviceLister.list().size() + + " services) , discovery client is now available"); + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/gson/EndpointsTrimmingStrategy.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/gson/EndpointsTrimmingStrategy.java new file mode 100644 index 00000000..069b1b79 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/gson/EndpointsTrimmingStrategy.java @@ -0,0 +1,39 @@ +/* + * Copyright 2013-2019 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.client.discovery.gson; + +import com.google.gson.ExclusionStrategy; +import com.google.gson.FieldAttributes; +import io.kubernetes.client.openapi.models.V1ObjectMeta; + +public class EndpointsTrimmingStrategy implements ExclusionStrategy { + + @Override + public boolean shouldSkipField(FieldAttributes fieldAttributes) { + // trimming field-managers + if (V1ObjectMeta.class.equals(fieldAttributes.getDeclaringClass())) { + return "managedFields".equals(fieldAttributes.getName()); + } + return false; + } + + @Override + public boolean shouldSkipClass(Class aClass) { + return false; + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/gson/ServiceTrimmingStrategy.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/gson/ServiceTrimmingStrategy.java new file mode 100644 index 00000000..9b6f4fec --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/gson/ServiceTrimmingStrategy.java @@ -0,0 +1,44 @@ +/* + * Copyright 2013-2019 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.client.discovery.gson; + +import com.google.gson.ExclusionStrategy; +import com.google.gson.FieldAttributes; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1ServiceSpec; +import io.kubernetes.client.openapi.models.V1ServiceStatus; + +public class ServiceTrimmingStrategy implements ExclusionStrategy { + + @Override + public boolean shouldSkipField(FieldAttributes fieldAttributes) { + // trimming field-managers + if (V1ObjectMeta.class.equals(fieldAttributes.getDeclaringClass())) { + return "managedFields".equals(fieldAttributes.getName()); + } + return false; + } + + @Override + public boolean shouldSkipClass(Class aClass) { + if (V1ServiceSpec.class.equals(aClass)) { + return true; + } + return V1ServiceStatus.class.equals(aClass); + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/resources/META-INF/spring.factories b/spring-cloud-kubernetes-client-discovery/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..e9ba6f55 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/resources/META-INF/spring.factories @@ -0,0 +1,6 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.springframework.cloud.kubernetes.client.discovery.KubernetesDiscoveryClientAutoConfiguration + +org.springframework.cloud.bootstrap.BootstrapConfiguration=\ +org.springframework.cloud.kubernetes.client.discovery.KubernetesDiscoveryClientConfigClientBootstrapConfiguration + diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java new file mode 100644 index 00000000..c654f61d --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java @@ -0,0 +1,68 @@ +/* + * Copyright 2013-2019 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.client.discovery; + +import io.kubernetes.client.openapi.ApiClient; +import io.kubernetes.client.openapi.JSON; +import okhttp3.OkHttpClient; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClient; +import org.springframework.context.annotation.Bean; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + properties = { "spring.cloud.kubernetes.discovery.cacheLoadingTimeoutSeconds=5", + "spring.cloud.kubernetes.discovery.waitCacheReady=false" }) +public class KubernetesDiscoveryClientAutoConfigurationTests { + + @Autowired(required = false) + private DiscoveryClient discoveryClient; + + @Test + public void kubernetesDiscoveryClientCreated() { + assertThat(this.discoveryClient).isNotNull().isInstanceOf(CompositeDiscoveryClient.class); + + CompositeDiscoveryClient composite = (CompositeDiscoveryClient) this.discoveryClient; + assertThat(composite.getDiscoveryClients().stream() + .anyMatch(dc -> dc instanceof KubernetesInformerDiscoveryClient)).isTrue(); + } + + @SpringBootApplication + protected static class TestConfig { + + @Bean + public ApiClient apiClient() { + ApiClient apiClient = mock(ApiClient.class); + when(apiClient.getJSON()).thenReturn(new JSON()); + when(apiClient.getHttpClient()).thenReturn(new OkHttpClient.Builder().build()); + return apiClient; + } + + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java new file mode 100644 index 00000000..b2d94460 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java @@ -0,0 +1,116 @@ +/* + * Copyright 2013-2019 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.client.discovery; + +import java.util.Collections; + +import io.kubernetes.client.openapi.ApiClient; +import io.kubernetes.client.openapi.JSON; +import okhttp3.OkHttpClient; +import org.junit.After; +import org.junit.Test; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; +import org.springframework.boot.test.util.TestPropertyValues; +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.commons.util.UtilAutoConfiguration; +import org.springframework.cloud.config.client.ConfigClientProperties; +import org.springframework.cloud.config.client.DiscoveryClientConfigServiceBootstrapConfiguration; +import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration; +import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import static junit.framework.TestCase.assertEquals; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@Configuration(proxyBeanMethods = false) +@ConditionalOnProperty("spring.cloud.config.discovery.enabled") +@Import({ KubernetesClientAutoConfiguration.class, KubernetesDiscoveryClientAutoConfiguration.class }) +public class KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests { + + private AnnotationConfigApplicationContext context; + + @After + public void close() { + if (this.context != null) { + if (this.context.getParent() != null) { + ((AnnotationConfigApplicationContext) this.context.getParent()).close(); + } + this.context.close(); + } + } + + @Test + public void onWhenRequested() throws Exception { + setup("server.port=7000", "spring.cloud.config.discovery.enabled=true", + "spring.cloud.kubernetes.discovery.enabled:true", "spring.cloud.kubernetes.enabled:true", + "spring.application.name:test", "spring.cloud.config.discovery.service-id:configserver"); + assertEquals(1, this.context.getParent().getBeanNamesForType(DiscoveryClient.class).length); + + DiscoveryClient client = this.context.getParent().getBean(DiscoveryClient.class); + verify(client, atLeast(2)).getInstances("configserver"); + ConfigClientProperties locator = this.context.getBean(ConfigClientProperties.class); + assertEquals("http://fake:8888/", locator.getUri()[0]); + } + + private void setup(String... env) { + AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext(); + TestPropertyValues.of(env).applyTo(parent); + parent.register(UtilAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class, + EnvironmentKnobbler.class, KubernetesCommonsAutoConfiguration.class, + KubernetesClientAutoConfiguration.class, KubernetesDiscoveryClientAutoConfiguration.class, + DiscoveryClientConfigServiceBootstrapConfiguration.class, ConfigClientProperties.class); + parent.refresh(); + this.context = new AnnotationConfigApplicationContext(); + this.context.setParent(parent); + this.context.register(PropertyPlaceholderAutoConfiguration.class, KubernetesCommonsAutoConfiguration.class, + KubernetesDiscoveryClientAutoConfiguration.class); + this.context.refresh(); + } + + @Configuration(proxyBeanMethods = false) + protected static class EnvironmentKnobbler { + + @Bean + public ApiClient apiClient() { + ApiClient apiClient = mock(ApiClient.class); + when(apiClient.getJSON()).thenReturn(new JSON()); + when(apiClient.getHttpClient()).thenReturn(new OkHttpClient.Builder().build()); + return apiClient; + } + + @Bean + public KubernetesInformerDiscoveryClient kubernetesInformerDiscoveryClient() { + KubernetesInformerDiscoveryClient client = mock(KubernetesInformerDiscoveryClient.class); + ServiceInstance instance = new DefaultServiceInstance("configserver1", "configserver", "fake", 8888, false); + given(client.getInstances("configserver")).willReturn(Collections.singletonList(instance)); + return client; + } + + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClientTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClientTests.java new file mode 100644 index 00000000..24e257e6 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesInformerDiscoveryClientTests.java @@ -0,0 +1,145 @@ +/* + * Copyright 2013-2019 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.client.discovery; + +import java.util.HashMap; + +import io.kubernetes.client.informer.SharedInformerFactory; +import io.kubernetes.client.informer.cache.Cache; +import io.kubernetes.client.informer.cache.Lister; +import io.kubernetes.client.openapi.models.V1EndpointAddress; +import io.kubernetes.client.openapi.models.V1EndpointPort; +import io.kubernetes.client.openapi.models.V1EndpointSubset; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServiceSpec; +import io.kubernetes.client.openapi.models.V1ServiceStatus; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnitRunner; + +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class KubernetesInformerDiscoveryClientTests { + + @Mock + private SharedInformerFactory sharedInformerFactory; + + @Mock + private KubernetesDiscoveryProperties kubernetesDiscoveryProperties; + + private static final V1Service testService1 = new V1Service() + .metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1")) + .spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus()); + + private static final V1Service testService2 = new V1Service() + .metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace2")) + .spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus()); + + private static final V1Endpoints testEndpoints1 = new V1Endpoints() + .metadata(new V1ObjectMeta().name("test-svc-1").namespace("namespace1")) + .addSubsetsItem(new V1EndpointSubset().addPortsItem(new V1EndpointPort().port(8080)) + .addAddressesItem(new V1EndpointAddress().ip("2.2.2.2"))); + + @Test + public void testDiscoveryGetServicesAllNamespaceShouldWork() { + Lister serviceLister = setupServiceLister(testService1, testService2); + + when(kubernetesDiscoveryProperties.isAllNamespaces()).thenReturn(true); + + KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("", + sharedInformerFactory, serviceLister, null, null, null, kubernetesDiscoveryProperties); + + assertThat(discoveryClient.getServices().toArray()).containsOnly(testService1.getMetadata().getName(), + testService2.getMetadata().getName()); + + verify(kubernetesDiscoveryProperties, times(1)).isAllNamespaces(); + } + + @Test + public void testDiscoveryGetServicesOneNamespaceShouldWork() { + Lister serviceLister = setupServiceLister(testService1, testService2); + + when(kubernetesDiscoveryProperties.isAllNamespaces()).thenReturn(false); + + KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1", + sharedInformerFactory, serviceLister, null, null, null, kubernetesDiscoveryProperties); + + assertThat(discoveryClient.getServices().toArray()).containsOnly(testService1.getMetadata().getName()); + + verify(kubernetesDiscoveryProperties, times(1)).isAllNamespaces(); + } + + @Test + public void testDiscoveryGetInstanceAllNamespaceShouldWork() { + Lister serviceLister = setupServiceLister(testService1, testService2); + Lister endpointsLister = setupEndpointsLister(testEndpoints1); + + when(kubernetesDiscoveryProperties.isAllNamespaces()).thenReturn(true); + + KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("", + sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties); + + assertThat(discoveryClient.getInstances("test-svc-1")) + .containsOnly(new KubernetesServiceInstance("", "test-svc-1", "2.2.2.2", 8080, new HashMap<>(), false)); + + verify(kubernetesDiscoveryProperties, times(1)).isAllNamespaces(); + } + + @Test + public void testDiscoveryGetInstanceOneNamespaceShouldWork() { + Lister serviceLister = setupServiceLister(testService1, testService2); + Lister endpointsLister = setupEndpointsLister(testEndpoints1); + + when(kubernetesDiscoveryProperties.isAllNamespaces()).thenReturn(false); + + KubernetesInformerDiscoveryClient discoveryClient = new KubernetesInformerDiscoveryClient("namespace1", + sharedInformerFactory, serviceLister, endpointsLister, null, null, kubernetesDiscoveryProperties); + + assertThat(discoveryClient.getInstances("test-svc-1")) + .containsOnly(new KubernetesServiceInstance("", "test-svc-1", "2.2.2.2", 8080, new HashMap<>(), false)); + verify(kubernetesDiscoveryProperties, times(1)).isAllNamespaces(); + } + + private Lister setupServiceLister(V1Service... services) { + Cache serviceCache = new Cache<>(); + Lister serviceLister = new Lister<>(serviceCache); + for (V1Service svc : services) { + serviceCache.add(svc); + } + return serviceLister; + } + + private Lister setupEndpointsLister(V1Endpoints... endpoints) { + Cache endpointsCache = new Cache<>(); + Lister endpointsLister = new Lister<>(endpointsCache); + for (V1Endpoints ep : endpoints) { + endpointsCache.add(ep); + } + return endpointsLister; + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesServiceInstanceTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesServiceInstanceTests.java new file mode 100644 index 00000000..97ee7128 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesServiceInstanceTests.java @@ -0,0 +1,52 @@ +/* + * 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.client.discovery; + +import java.util.Collections; + +import org.junit.Test; + +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; + +import static org.assertj.core.api.Assertions.assertThat; + +public class KubernetesServiceInstanceTests { + + @Test + public void schemeIsHttp() { + assertServiceInstance(false); + } + + private KubernetesServiceInstance assertServiceInstance(boolean secure) { + KubernetesServiceInstance instance = new KubernetesServiceInstance("123", "myservice", "1.2.3.4", 8080, + Collections.emptyMap(), secure); + + assertThat(instance.getInstanceId()).isEqualTo("123"); + assertThat(instance.getServiceId()).isEqualTo("myservice"); + assertThat(instance.getHost()).isEqualTo("1.2.3.4"); + assertThat(instance.getPort()).isEqualTo(8080); + assertThat(instance.isSecure()).isEqualTo(secure); + assertThat(instance.getScheme()).isEqualTo(secure ? "https" : "http"); + return instance; + } + + @Test + public void schemeIsHttps() { + assertServiceInstance(true); + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/gson/EndpointsTrimmingStrategyTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/gson/EndpointsTrimmingStrategyTests.java new file mode 100644 index 00000000..c7fed980 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/gson/EndpointsTrimmingStrategyTests.java @@ -0,0 +1,45 @@ +/* + * Copyright 2013-2019 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.client.discovery.gson; + +import java.util.Arrays; + +import com.google.gson.Gson; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1ManagedFieldsEntry; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import org.junit.Assert; +import org.junit.Test; + +public class EndpointsTrimmingStrategyTests { + + @Test + public void testDeserializingEndpoints() { + Gson gson = new Gson().newBuilder().addDeserializationExclusionStrategy(new EndpointsTrimmingStrategy()) + .create(); + V1Endpoints input = new V1Endpoints() + .metadata(new V1ObjectMeta().name("foo").managedFields(Arrays.asList(new V1ManagedFieldsEntry()))); + + String data = gson.toJson(input); + V1Endpoints output = gson.fromJson(data, V1Endpoints.class); + + // managed-fields should be excluded + Assert.assertNull(output.getMetadata().getManagedFields()); + + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/gson/ServiceTrimmingStrategyTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/gson/ServiceTrimmingStrategyTests.java new file mode 100644 index 00000000..6a5657eb --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/gson/ServiceTrimmingStrategyTests.java @@ -0,0 +1,52 @@ +/* + * Copyright 2013-2019 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.client.discovery.gson; + +import java.util.Arrays; + +import com.google.gson.Gson; +import io.kubernetes.client.openapi.models.V1LoadBalancerIngress; +import io.kubernetes.client.openapi.models.V1LoadBalancerStatus; +import io.kubernetes.client.openapi.models.V1ManagedFieldsEntry; +import io.kubernetes.client.openapi.models.V1ObjectMeta; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServiceSpec; +import io.kubernetes.client.openapi.models.V1ServiceStatus; +import org.junit.Assert; +import org.junit.Test; + +public class ServiceTrimmingStrategyTests { + + @Test + public void testDeserializingService() { + Gson gson = new Gson().newBuilder().addDeserializationExclusionStrategy(new ServiceTrimmingStrategy()).create(); + V1Service input = new V1Service() + .metadata(new V1ObjectMeta().name("foo").managedFields(Arrays.asList(new V1ManagedFieldsEntry()))) + .spec(new V1ServiceSpec().loadBalancerIP("1.1.1.1")).status(new V1ServiceStatus().loadBalancer( + new V1LoadBalancerStatus().addIngressItem(new V1LoadBalancerIngress().ip("2.2.2.2")))); + String data = gson.toJson(input); + V1Service output = gson.fromJson(data, V1Service.class); + + // spec should be excluded + Assert.assertNull(output.getSpec()); + // status should be excluded + Assert.assertNull(output.getStatus()); + // managed-fields should be excluded + Assert.assertNull(output.getMetadata().getManagedFields()); + } + +} diff --git a/spring-cloud-kubernetes-commons/pom.xml b/spring-cloud-kubernetes-commons/pom.xml index 6db6bab1..09d5cc93 100644 --- a/spring-cloud-kubernetes-commons/pom.xml +++ b/spring-cloud-kubernetes-commons/pom.xml @@ -16,6 +16,10 @@ org.springframework.boot spring-boot-autoconfigure + + org.springframework.cloud + spring-cloud-commons + org.springframework.boot spring-boot-actuator-autoconfigure diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryProperties.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesDiscoveryProperties.java similarity index 86% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryProperties.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesDiscoveryProperties.java index c3d2bf4a..ba338928 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryProperties.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesDiscoveryProperties.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.commons.discovery; import java.util.HashMap; import java.util.HashSet; @@ -23,14 +23,10 @@ import java.util.Set; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.core.style.ToStringCreator; -/** - * Kubernetes discovery properties. - * - * @author Ioannis Canellos - */ +import static org.springframework.cloud.client.discovery.DiscoveryClient.DEFAULT_ORDER; + @ConfigurationProperties("spring.cloud.kubernetes.discovery") public class KubernetesDiscoveryProperties { @@ -44,6 +40,17 @@ public class KubernetesDiscoveryProperties { /** If discovering all namespaces. */ private boolean allNamespaces = false; + /* + * If wait for the discovery cache (service and endpoints) to be fully loaded, + * otherwise aborts the application on starting. + */ + private boolean waitCacheReady = true; + + /** + * Timeout for initializing discovery cache, will abort the application if exceeded. + **/ + private long cacheLoadingTimeoutSeconds = 60; + /** * SpEL expression to filter services AFTER they have been retrieved from the * Kubernetes API server. @@ -72,7 +79,7 @@ public class KubernetesDiscoveryProperties { private Metadata metadata = new Metadata(); - private int order = DiscoveryClient.DEFAULT_ORDER; + private int order = DEFAULT_ORDER; public boolean isEnabled() { return this.enabled; @@ -146,6 +153,22 @@ public class KubernetesDiscoveryProperties { this.order = order; } + public boolean isWaitCacheReady() { + return waitCacheReady; + } + + public void setWaitCacheReady(boolean waitCacheReady) { + this.waitCacheReady = waitCacheReady; + } + + public long getCacheLoadingTimeoutSeconds() { + return cacheLoadingTimeoutSeconds; + } + + public void setCacheLoadingTimeoutSeconds(long cacheLoadingTimeoutSeconds) { + this.cacheLoadingTimeoutSeconds = cacheLoadingTimeoutSeconds; + } + @Override public String toString() { return new ToStringCreator(this).append("enabled", this.enabled).append("serviceName", this.serviceName) diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesServiceInstance.java similarity index 78% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java rename to spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesServiceInstance.java index c48b8316..042c9995 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesServiceInstance.java @@ -14,18 +14,14 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.commons.discovery; import java.net.URI; import java.util.Map; +import java.util.Objects; import org.springframework.cloud.client.ServiceInstance; -/** - * Kubernetes {@link ServiceInstance}. - * - * @author Ioannis Canellos - */ public class KubernetesServiceInstance implements ServiceInstance { /** @@ -114,13 +110,31 @@ public class KubernetesServiceInstance implements ServiceInstance { } private URI createUri(String scheme, String host, int port) { - StringBuilder sb = new StringBuilder(); - sb.append(scheme).append(COLON).append(DSL).append(host).append(COLON).append(port); - return URI.create(sb.toString()); + return URI.create(scheme + COLON + DSL + host + COLON + port); } public String getNamespace() { return this.metadata != null ? this.metadata.get(NAMESPACE_METADATA_KEY) : null; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + KubernetesServiceInstance that = (KubernetesServiceInstance) o; + return port == that.port && Objects.equals(instanceId, that.instanceId) + && Objects.equals(serviceId, that.serviceId) && Objects.equals(host, that.host) + && Objects.equals(uri, that.uri) && Objects.equals(secure, that.secure) + && Objects.equals(metadata, that.metadata); + } + + @Override + public int hashCode() { + return Objects.hash(instanceId, serviceId, host, port, uri, secure, metadata); + } + } diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/ConfigurationWatcherAutoConfiguration.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/ConfigurationWatcherAutoConfiguration.java index f4afd684..d0675067 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/ConfigurationWatcherAutoConfiguration.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/ConfigurationWatcherAutoConfiguration.java @@ -26,9 +26,9 @@ import org.springframework.cloud.bus.BusProperties; import org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigReloadProperties; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigurationUpdateStrategy; -import org.springframework.cloud.kubernetes.discovery.reactive.KubernetesReactiveDiscoveryClient; import org.springframework.cloud.kubernetes.fabric8.config.Fabric8ConfigMapPropertySourceLocator; import org.springframework.cloud.kubernetes.fabric8.config.Fabric8SecretsPropertySourceLocator; +import org.springframework.cloud.kubernetes.fabric8.discovery.reactive.KubernetesReactiveDiscoveryClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetector.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetector.java index ea6c8eea..e72ae7ea 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetector.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetector.java @@ -29,8 +29,8 @@ import reactor.core.publisher.Mono; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigReloadProperties; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigurationUpdateStrategy; -import org.springframework.cloud.kubernetes.discovery.reactive.KubernetesReactiveDiscoveryClient; import org.springframework.cloud.kubernetes.fabric8.config.Fabric8ConfigMapPropertySourceLocator; +import org.springframework.cloud.kubernetes.fabric8.discovery.reactive.KubernetesReactiveDiscoveryClient; import org.springframework.core.env.AbstractEnvironment; import org.springframework.http.ResponseEntity; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetector.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetector.java index 29b13dcd..8d332abe 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetector.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/main/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetector.java @@ -27,8 +27,8 @@ import reactor.core.publisher.Mono; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigReloadProperties; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigurationUpdateStrategy; -import org.springframework.cloud.kubernetes.discovery.reactive.KubernetesReactiveDiscoveryClient; import org.springframework.cloud.kubernetes.fabric8.config.Fabric8SecretsPropertySourceLocator; +import org.springframework.cloud.kubernetes.fabric8.discovery.reactive.KubernetesReactiveDiscoveryClient; import org.springframework.core.env.AbstractEnvironment; import org.springframework.http.ResponseEntity; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetectorTests.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetectorTests.java index ad37e3bf..db211ae0 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetectorTests.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedConfigMapWatchChangeDetectorTests.java @@ -40,9 +40,9 @@ import reactor.test.StepVerifier; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigReloadProperties; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigurationUpdateStrategy; -import org.springframework.cloud.kubernetes.discovery.KubernetesServiceInstance; -import org.springframework.cloud.kubernetes.discovery.reactive.KubernetesReactiveDiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; import org.springframework.cloud.kubernetes.fabric8.config.Fabric8ConfigMapPropertySourceLocator; +import org.springframework.cloud.kubernetes.fabric8.discovery.reactive.KubernetesReactiveDiscoveryClient; import org.springframework.mock.env.MockEnvironment; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.reactive.function.client.WebClient; diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetectorTests.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetectorTests.java index 3b177bae..d1c13d2e 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetectorTests.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-configuration-watcher/src/test/java/org/springframework/cloud/kubernetes/configuration/watcher/HttpBasedSecretsWatchChangeDetectorTests.java @@ -40,9 +40,9 @@ import reactor.test.StepVerifier; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigReloadProperties; import org.springframework.cloud.kubernetes.commons.config.reload.ConfigurationUpdateStrategy; -import org.springframework.cloud.kubernetes.discovery.KubernetesServiceInstance; -import org.springframework.cloud.kubernetes.discovery.reactive.KubernetesReactiveDiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; import org.springframework.cloud.kubernetes.fabric8.config.Fabric8SecretsPropertySourceLocator; +import org.springframework.cloud.kubernetes.fabric8.discovery.reactive.KubernetesReactiveDiscoveryClient; import org.springframework.mock.env.MockEnvironment; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.reactive.function.client.WebClient; diff --git a/spring-cloud-kubernetes-dependencies/pom.xml b/spring-cloud-kubernetes-dependencies/pom.xml index 84c9931a..a1935fee 100644 --- a/spring-cloud-kubernetes-dependencies/pom.xml +++ b/spring-cloud-kubernetes-dependencies/pom.xml @@ -61,6 +61,11 @@ client-java-extended ${kubernetes-java-client.version} + + io.kubernetes + client-java-spring-integration + ${kubernetes-java-client.version} + me.snowdrop @@ -89,7 +94,13 @@ org.springframework.cloud - spring-cloud-kubernetes-discovery + spring-cloud-kubernetes-client-discovery + ${project.version} + + + + org.springframework.cloud + spring-cloud-kubernetes-fabric8-discovery ${project.version} diff --git a/spring-cloud-kubernetes-discovery/src/main/resources/META-INF/spring.factories b/spring-cloud-kubernetes-discovery/src/main/resources/META-INF/spring.factories deleted file mode 100644 index dea3148d..00000000 --- a/spring-cloud-kubernetes-discovery/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,6 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.kubernetes.discovery.KubernetesCatalogWatchAutoConfiguration, \ -org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryClientAutoConfiguration, \ -org.springframework.cloud.kubernetes.discovery.reactive.KubernetesReactiveDiscoveryClientAutoConfiguration -org.springframework.cloud.bootstrap.BootstrapConfiguration=\ -org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryClientConfigClientBootstrapConfiguration diff --git a/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/pom.xml b/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/pom.xml index 8ff805d5..5703785c 100644 --- a/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/pom.xml +++ b/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/pom.xml @@ -37,7 +37,7 @@ org.springframework.cloud - spring-cloud-kubernetes-discovery + spring-cloud-kubernetes-fabric8-discovery ${project.version} diff --git a/spring-cloud-kubernetes-discovery/.jdk8 b/spring-cloud-kubernetes-fabric8-discovery/.jdk8 similarity index 100% rename from spring-cloud-kubernetes-discovery/.jdk8 rename to spring-cloud-kubernetes-fabric8-discovery/.jdk8 diff --git a/spring-cloud-kubernetes-discovery/pom.xml b/spring-cloud-kubernetes-fabric8-discovery/pom.xml similarity index 98% rename from spring-cloud-kubernetes-discovery/pom.xml rename to spring-cloud-kubernetes-fabric8-discovery/pom.xml index ea4706a6..d168c4bd 100644 --- a/spring-cloud-kubernetes-discovery/pom.xml +++ b/spring-cloud-kubernetes-fabric8-discovery/pom.xml @@ -26,7 +26,7 @@ 4.0.0 - spring-cloud-kubernetes-discovery + spring-cloud-kubernetes-fabric8-discovery Spring Cloud Kubernetes :: Discovery diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/ConditionalOnKubernetesDiscoveryEnabled.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/ConditionalOnKubernetesDiscoveryEnabled.java similarity index 95% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/ConditionalOnKubernetesDiscoveryEnabled.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/ConditionalOnKubernetesDiscoveryEnabled.java index 3be47732..26de9d82 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/ConditionalOnKubernetesDiscoveryEnabled.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/ConditionalOnKubernetesDiscoveryEnabled.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/DefaultIsServicePortSecureResolver.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/DefaultIsServicePortSecureResolver.java similarity index 96% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/DefaultIsServicePortSecureResolver.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/DefaultIsServicePortSecureResolver.java index a8a390fd..9b69b66a 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/DefaultIsServicePortSecureResolver.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/DefaultIsServicePortSecureResolver.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.HashMap; import java.util.HashSet; @@ -24,6 +24,8 @@ import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; + /** * TODO break up into delegates if the implementation get's more complicated *

diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/EndpointSubsetNS.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/EndpointSubsetNS.java similarity index 95% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/EndpointSubsetNS.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/EndpointSubsetNS.java index e9799622..489a10d8 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/EndpointSubsetNS.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/EndpointSubsetNS.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.ArrayList; import java.util.List; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatch.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatch.java similarity index 95% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatch.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatch.java index f3c79372..2a543ec2 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatch.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatch.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.Collection; import java.util.List; @@ -31,6 +31,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.client.discovery.event.HeartbeatEvent; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.scheduling.annotation.Scheduled; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchAutoConfiguration.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchAutoConfiguration.java similarity index 92% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchAutoConfiguration.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchAutoConfiguration.java index d35a4488..92af2b7d 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchAutoConfiguration.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchAutoConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import io.fabric8.kubernetes.client.KubernetesClient; @@ -22,6 +22,7 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesClientServicesFunction.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesClientServicesFunction.java similarity index 96% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesClientServicesFunction.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesClientServicesFunction.java index 00a70782..891d1c92 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesClientServicesFunction.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesClientServicesFunction.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.function.Function; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java similarity index 96% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java index 70db8717..39e78e16 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClient.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.ArrayList; import java.util.HashMap; @@ -34,6 +34,8 @@ import org.apache.commons.logging.LogFactory; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; import org.springframework.expression.Expression; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.SimpleEvaluationContext; @@ -41,7 +43,7 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; import static java.util.stream.Collectors.toMap; -import static org.springframework.cloud.kubernetes.discovery.KubernetesServiceInstance.NAMESPACE_METADATA_KEY; +import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance.NAMESPACE_METADATA_KEY; /** * Kubeneretes implementation of {@link DiscoveryClient}. diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfiguration.java similarity index 91% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfiguration.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfiguration.java index 3bcfb679..51b3110a 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import io.fabric8.kubernetes.client.KubernetesClient; @@ -26,9 +26,10 @@ import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled; import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; import org.springframework.cloud.kubernetes.commons.ConditionalOnKubernetesEnabled; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration; -import org.springframework.cloud.kubernetes.registry.KubernetesRegistration; -import org.springframework.cloud.kubernetes.registry.KubernetesServiceRegistry; +import org.springframework.cloud.kubernetes.fabric8.registry.KubernetesRegistration; +import org.springframework.cloud.kubernetes.fabric8.registry.KubernetesServiceRegistry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java similarity index 95% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java index abbbe708..7ab708f2 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClient.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClient.java similarity index 86% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClient.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClient.java index c3f9f8ab..f6f7c57d 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClient.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClient.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery.reactive; +package org.springframework.cloud.kubernetes.fabric8.discovery.reactive; import io.fabric8.kubernetes.client.KubernetesClient; import reactor.core.publisher.Flux; @@ -22,9 +22,9 @@ import reactor.core.scheduler.Schedulers; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; -import org.springframework.cloud.kubernetes.discovery.KubernetesClientServicesFunction; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryClient; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesClientServicesFunction; +import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient; import org.springframework.util.Assert; /** diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfiguration.java similarity index 87% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfiguration.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfiguration.java index d2e19f42..0c45fcc9 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfiguration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery.reactive; +package org.springframework.cloud.kubernetes.fabric8.discovery.reactive; import io.fabric8.kubernetes.client.KubernetesClient; @@ -31,10 +31,10 @@ import org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIn import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscoveryClientHealthIndicator; import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration; import org.springframework.cloud.kubernetes.commons.ConditionalOnKubernetesEnabled; -import org.springframework.cloud.kubernetes.discovery.ConditionalOnKubernetesDiscoveryEnabled; -import org.springframework.cloud.kubernetes.discovery.KubernetesClientServicesFunction; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryClientAutoConfiguration; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.fabric8.discovery.ConditionalOnKubernetesDiscoveryEnabled; +import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesClientServicesFunction; +import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesAutoServiceRegistration.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesAutoServiceRegistration.java similarity index 98% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesAutoServiceRegistration.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesAutoServiceRegistration.java index 24388eec..42e2ef30 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesAutoServiceRegistration.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesAutoServiceRegistration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.registry; +package org.springframework.cloud.kubernetes.fabric8.registry; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesRegistration.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesRegistration.java similarity index 93% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesRegistration.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesRegistration.java index aef1bb19..c2829775 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesRegistration.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesRegistration.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.registry; +package org.springframework.cloud.kubernetes.fabric8.registry; import java.io.Closeable; import java.io.IOException; @@ -26,7 +26,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import io.fabric8.kubernetes.client.KubernetesClient; import org.springframework.cloud.client.serviceregistry.Registration; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; /** * Kubernetes implementation of a {@link Registration}. diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesServiceRegistry.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesServiceRegistry.java similarity index 96% rename from spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesServiceRegistry.java rename to spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesServiceRegistry.java index d2266953..aa00697d 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/registry/KubernetesServiceRegistry.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/registry/KubernetesServiceRegistry.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.registry; +package org.springframework.cloud.kubernetes.fabric8.registry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/resources/META-INF/spring.factories b/spring-cloud-kubernetes-fabric8-discovery/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..4746c884 --- /dev/null +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/resources/META-INF/spring.factories @@ -0,0 +1,6 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesCatalogWatchAutoConfiguration, \ +org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientAutoConfiguration, \ +org.springframework.cloud.kubernetes.fabric8.discovery.reactive.KubernetesReactiveDiscoveryClientAutoConfiguration +org.springframework.cloud.bootstrap.BootstrapConfiguration=\ +org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientConfigClientBootstrapConfiguration diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/DefaultIsServicePortSecureResolverTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/DefaultIsServicePortSecureResolverTest.java similarity index 94% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/DefaultIsServicePortSecureResolverTest.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/DefaultIsServicePortSecureResolverTest.java index aa77c28c..d41c412f 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/DefaultIsServicePortSecureResolverTest.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/DefaultIsServicePortSecureResolverTest.java @@ -14,12 +14,14 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.HashMap; import org.junit.Test; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; + import static org.assertj.core.api.Assertions.assertThat; public class DefaultIsServicePortSecureResolverTest { diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogServicesWatchConfigurationTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogServicesWatchConfigurationTest.java similarity index 97% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogServicesWatchConfigurationTest.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogServicesWatchConfigurationTest.java index 9c86adc4..5031449e 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogServicesWatchConfigurationTest.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogServicesWatchConfigurationTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import io.fabric8.kubernetes.client.KubernetesClient; import org.junit.After; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchTest.java similarity index 98% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchTest.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchTest.java index b97bad97..37cb5a89 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchTest.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.Arrays; import java.util.Collections; @@ -40,6 +40,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.cloud.client.discovery.event.HeartbeatEvent; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.context.ApplicationEventPublisher; import static java.util.Arrays.stream; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfigurationPropertiesTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfigurationPropertiesTests.java similarity index 97% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfigurationPropertiesTests.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfigurationPropertiesTests.java index b74559be..fcdaba59 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfigurationPropertiesTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfigurationPropertiesTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import io.fabric8.kubernetes.client.KubernetesClient; import org.junit.After; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java similarity index 96% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java index cf46d24a..96d421a3 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientAutoConfigurationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java similarity index 98% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java index a7ca2da8..3befb3c5 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientConfigClientBootstrapConfigurationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.Collections; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientFilterMetadataTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterMetadataTest.java similarity index 98% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientFilterMetadataTest.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterMetadataTest.java index 6f9c7fae..ec127553 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientFilterMetadataTest.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterMetadataTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.Collections; import java.util.HashMap; @@ -49,6 +49,7 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import static java.util.stream.Collectors.toList; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientFilterTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterTest.java similarity index 96% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientFilterTest.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterTest.java index a2870d95..1fe1de06 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientFilterTest.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientFilterTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.ArrayList; import java.util.Arrays; @@ -33,6 +33,8 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; + import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTest.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java similarity index 98% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTest.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java index f3032795..96947716 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTest.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesDiscoveryClientTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.ArrayList; import java.util.HashMap; @@ -37,6 +37,8 @@ import org.junit.Test; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstanceTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesServiceInstanceTests.java similarity index 92% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstanceTests.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesServiceInstanceTests.java index 94737610..32087578 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstanceTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesServiceInstanceTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery; +package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.Collections; @@ -22,6 +22,8 @@ import io.fabric8.kubernetes.api.model.EndpointAddress; import io.fabric8.kubernetes.api.model.EndpointPort; import org.junit.Test; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; + import static org.assertj.core.api.Assertions.assertThat; public class KubernetesServiceInstanceTests { diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfigurationTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfigurationTests.java similarity index 96% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfigurationTests.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfigurationTests.java index 4347af9a..d2110922 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfigurationTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientAutoConfigurationTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery.reactive; +package org.springframework.cloud.kubernetes.fabric8.discovery.reactive; import org.junit.jupiter.api.Test; @@ -26,8 +26,8 @@ import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscoveryClientHealthIndicator; import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryClientAutoConfiguration; import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration; +import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientAutoConfiguration; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientTests.java similarity index 87% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientTests.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientTests.java index e1a90f77..1be42da5 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/reactive/KubernetesReactiveDiscoveryClientTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/reactive/KubernetesReactiveDiscoveryClientTests.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery.reactive; +package org.springframework.cloud.kubernetes.fabric8.discovery.reactive; import java.util.ArrayList; import java.util.HashMap; @@ -37,10 +37,8 @@ import reactor.test.StepVerifier; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; -import org.springframework.cloud.kubernetes.discovery.support.KubernetesExtension; -import org.springframework.cloud.kubernetes.discovery.support.KubernetesExtension.Client; -import org.springframework.cloud.kubernetes.discovery.support.KubernetesExtension.Server; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.fabric8.discovery.support.KubernetesExtension; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; @@ -52,7 +50,7 @@ import static org.assertj.core.api.Assertions.assertThat; class KubernetesReactiveDiscoveryClientTests { @BeforeEach - public void setup(@Client KubernetesClient kubernetesClient) { + public void setup(@KubernetesExtension.Client KubernetesClient kubernetesClient) { // Configure the kubernetes master url to point to the mock server System.setProperty(Config.KUBERNETES_MASTER_SYSTEM_PROPERTY, kubernetesClient.getConfiguration().getMasterUrl()); @@ -63,7 +61,7 @@ class KubernetesReactiveDiscoveryClientTests { } @Test - public void verifyDefaults(@Client KubernetesClient kubernetesClient) { + public void verifyDefaults(@KubernetesExtension.Client KubernetesClient kubernetesClient) { KubernetesDiscoveryProperties properties = new KubernetesDiscoveryProperties(); ReactiveDiscoveryClient client = new KubernetesReactiveDiscoveryClient(kubernetesClient, properties, KubernetesClient::services); @@ -72,8 +70,8 @@ class KubernetesReactiveDiscoveryClientTests { } @Test - public void shouldReturnFluxOfServices(@Client KubernetesClient kubernetesClient, - @Server KubernetesServer kubernetesServer) { + public void shouldReturnFluxOfServices(@KubernetesExtension.Client KubernetesClient kubernetesClient, + @KubernetesExtension.Server KubernetesServer kubernetesServer) { kubernetesServer.expect().get().withPath("/api/v1/namespaces/test/services") .andReturn(200, new ServiceListBuilder().addNewItem().withNewMetadata().withName("s1") .withLabels(new HashMap() { @@ -98,8 +96,9 @@ class KubernetesReactiveDiscoveryClientTests { } @Test - public void shouldReturnEmptyFluxOfServicesWhenNoInstancesFound(@Client KubernetesClient kubernetesClient, - @Server KubernetesServer kubernetesServer) { + public void shouldReturnEmptyFluxOfServicesWhenNoInstancesFound( + @KubernetesExtension.Client KubernetesClient kubernetesClient, + @KubernetesExtension.Server KubernetesServer kubernetesServer) { kubernetesServer.expect().get().withPath("/api/v1/namespaces/test/services") .andReturn(200, new ServiceListBuilder().build()).once(); @@ -111,8 +110,9 @@ class KubernetesReactiveDiscoveryClientTests { } @Test - public void shouldReturnEmptyFluxForNonExistingService(@Client KubernetesClient kubernetesClient, - @Server KubernetesServer kubernetesServer) { + public void shouldReturnEmptyFluxForNonExistingService( + @KubernetesExtension.Client KubernetesClient kubernetesClient, + @KubernetesExtension.Server KubernetesServer kubernetesServer) { kubernetesServer.expect().get() .withPath("/api/v1/namespaces/test/endpoints?fieldSelector=metadata.name%3Dnonexistent-service") .andReturn(200, new EndpointsBuilder().build()).once(); @@ -125,8 +125,9 @@ class KubernetesReactiveDiscoveryClientTests { } @Test - public void shouldReturnEmptyFluxWhenServiceHasNoSubsets(@Client KubernetesClient kubernetesClient, - @Server KubernetesServer kubernetesServer) { + public void shouldReturnEmptyFluxWhenServiceHasNoSubsets( + @KubernetesExtension.Client KubernetesClient kubernetesClient, + @KubernetesExtension.Server KubernetesServer kubernetesServer) { kubernetesServer.expect().get().withPath("/api/v1/namespaces/test/services") .andReturn(200, new ServiceListBuilder().addNewItem().withNewMetadata().withName("existing-service") .withLabels(new HashMap() { @@ -148,7 +149,8 @@ class KubernetesReactiveDiscoveryClientTests { } @Test - public void shouldReturnFlux(@Client KubernetesClient kubernetesClient, @Server KubernetesServer kubernetesServer) { + public void shouldReturnFlux(@KubernetesExtension.Client KubernetesClient kubernetesClient, + @KubernetesExtension.Server KubernetesServer kubernetesServer) { ServiceList services = new ServiceListBuilder().addNewItem().withNewMetadata().withName("existing-service") .withNamespace("test").withLabels(new HashMap() { { @@ -187,8 +189,8 @@ class KubernetesReactiveDiscoveryClientTests { } @Test - public void shouldReturnFluxWithPrefixedMetadata(@Client KubernetesClient kubernetesClient, - @Server KubernetesServer kubernetesServer) { + public void shouldReturnFluxWithPrefixedMetadata(@KubernetesExtension.Client KubernetesClient kubernetesClient, + @KubernetesExtension.Server KubernetesServer kubernetesServer) { kubernetesServer.expect().get().withPath("/api/v1/namespaces/test/services") .andReturn(200, new ServiceListBuilder().addNewItem().withNewMetadata().withName("existing-service") .withLabels(new HashMap() { @@ -233,7 +235,8 @@ class KubernetesReactiveDiscoveryClientTests { @Test public void shouldReturnFluxWhenServiceHasMultiplePortsAndPrimaryPortNameIsSet( - @Client KubernetesClient kubernetesClient, @Server KubernetesServer kubernetesServer) { + @KubernetesExtension.Client KubernetesClient kubernetesClient, + @KubernetesExtension.Server KubernetesServer kubernetesServer) { kubernetesServer.expect().get().withPath("/api/v1/namespaces/test/services") .andReturn(200, new ServiceListBuilder().addNewItem().withNewMetadata().withName("existing-service") .withLabels(new HashMap() { @@ -276,8 +279,9 @@ class KubernetesReactiveDiscoveryClientTests { } @Test - public void shouldReturnFluxOfServicesAcrossAllNamespaces(@Client KubernetesClient kubernetesClient, - @Server KubernetesServer kubernetesServer) { + public void shouldReturnFluxOfServicesAcrossAllNamespaces( + @KubernetesExtension.Client KubernetesClient kubernetesClient, + @KubernetesExtension.Server KubernetesServer kubernetesServer) { kubernetesServer.expect().get().withPath("/api/v1/namespaces/test/services") .andReturn(200, new ServiceListBuilder().addNewItem().withNewMetadata().withName("existing-service") .withLabels(new HashMap() { diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/support/KubernetesExtension.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/support/KubernetesExtension.java similarity index 97% rename from spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/support/KubernetesExtension.java rename to spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/support/KubernetesExtension.java index e03d31da..761b9b6e 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/support/KubernetesExtension.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/support/KubernetesExtension.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.springframework.cloud.kubernetes.discovery.support; +package org.springframework.cloud.kubernetes.fabric8.discovery.support; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/spring-cloud-kubernetes-integration-tests/discovery/discovery-client/pom.xml b/spring-cloud-kubernetes-integration-tests/discovery/discovery-client/pom.xml index 09e8a156..1abb9136 100644 --- a/spring-cloud-kubernetes-integration-tests/discovery/discovery-client/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/discovery/discovery-client/pom.xml @@ -24,7 +24,7 @@ org.springframework.cloud - spring-cloud-kubernetes-discovery + spring-cloud-kubernetes-fabric8-discovery diff --git a/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/pom.xml b/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/pom.xml new file mode 100644 index 00000000..89a6de82 --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + + org.springframework.cloud + discovery-parent + 2.0.0-SNAPSHOT + + + kubernetes-client-discovery + Spring Cloud Kubernetes :: Integration Tests :: Kubernetes Client Discovery + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.cloud + spring-cloud-kubernetes-client-discovery + ${project.version} + + + + diff --git a/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/fabric8/deployment.yml b/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/fabric8/deployment.yml new file mode 100644 index 00000000..f40eb7e9 --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/fabric8/deployment.yml @@ -0,0 +1,10 @@ +# We need this fragment in order for the kubernetes client to talk to +# the Kubernetes API without caring about proper certificates +spec: + template: + spec: + containers: + - env: + - name: KUBERNETES_TRUST_CERTIFICATES + value: true + diff --git a/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/fabric8/svc.yml b/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/fabric8/svc.yml new file mode 100644 index 00000000..945f430d --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/fabric8/svc.yml @@ -0,0 +1,15 @@ +# we are using an FMP fragment to ensure that NodePort is used correctly +kind: Service +apiVersion: v1 +metadata: + name: ${project.artifactId} + labels: + app: ${project.artifactId} +spec: + selector: + app: ${project.artifactId} + ports: + - protocol: TCP + port: 8080 + nodePort: ${nodeport.value} + type: NodePort diff --git a/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/it/DiscoveryClientApplication.java b/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/it/DiscoveryClientApplication.java new file mode 100644 index 00000000..ef12e9ab --- /dev/null +++ b/spring-cloud-kubernetes-integration-tests/discovery/kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/it/DiscoveryClientApplication.java @@ -0,0 +1,51 @@ +/* + * Copyright 2013-2019 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.it; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@RestController +public class DiscoveryClientApplication { + + @Autowired + private DiscoveryClient discoveryClient; + + public static void main(String[] args) { + SpringApplication.run(DiscoveryClientApplication.class, args); + } + + @GetMapping("/services") + public List services() { + return this.discoveryClient.getServices(); + } + + @GetMapping("/services/{service}/instances") + public List instances(@PathVariable("service") String service) { + return this.discoveryClient.getInstances(service); + } + +} diff --git a/spring-cloud-kubernetes-integration-tests/discovery/pom.xml b/spring-cloud-kubernetes-integration-tests/discovery/pom.xml index bbef858b..5f85cc12 100644 --- a/spring-cloud-kubernetes-integration-tests/discovery/pom.xml +++ b/spring-cloud-kubernetes-integration-tests/discovery/pom.xml @@ -18,6 +18,7 @@ discovery-service-a discovery-service-b discovery-client + kubernetes-client-discovery tests diff --git a/spring-cloud-kubernetes-integration-tests/permissions.yaml b/spring-cloud-kubernetes-integration-tests/permissions.yaml index 3c255bae..104fd0a6 100644 --- a/spring-cloud-kubernetes-integration-tests/permissions.yaml +++ b/spring-cloud-kubernetes-integration-tests/permissions.yaml @@ -9,22 +9,23 @@ items: app: integration-test name: spring-cloud-kubernetes-serviceaccount - apiVersion: rbac.authorization.k8s.io/v1 - kind: RoleBinding + kind: ClusterRoleBinding metadata: labels: app: spring-cloud-kubernetes-core-k8s-client-it name: spring-cloud-kubernetes-core-k8s-client-it:view roleRef: - kind: Role + kind: ClusterRole apiGroup: rbac.authorization.k8s.io name: namespace-reader subjects: - kind: ServiceAccount name: spring-cloud-kubernetes-serviceaccount + namespace: default - apiVersion: rbac.authorization.k8s.io/v1 - kind: Role + kind: ClusterRole metadata: - namespace: default +# namespace: default name: namespace-reader rules: - apiGroups: ["", "extensions", "apps"] diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-core-k8s-client-it/src/test/java/org/springframework/cloud/kubernetes/core/k8s/it/ActuatorEndpointIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-core-k8s-client-it/src/test/java/org/springframework/cloud/kubernetes/core/k8s/it/ActuatorEndpointIT.java index fabd3577..e093d547 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-core-k8s-client-it/src/test/java/org/springframework/cloud/kubernetes/core/k8s/it/ActuatorEndpointIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-core-k8s-client-it/src/test/java/org/springframework/cloud/kubernetes/core/k8s/it/ActuatorEndpointIT.java @@ -105,9 +105,9 @@ public class ActuatorEndpointIT { k8SUtils = new K8SUtils(api, appsApi); DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withRegistryUrl(KIND_REPO_URL).build(); + .withRegistryUrl(KIND_REPO_URL).build(); DockerHttpClient httpClient = new ApacheDockerHttpClient.Builder().dockerHost(config.getDockerHost()) - .sslConfig(config.getSSLConfig()).build(); + .sslConfig(config.getSSLConfig()).build(); DockerClient dockerClient = DockerClientImpl.getInstance(config, httpClient); dockerClient.tagImageCmd(LOCAL_IMAGE, KIND_IMAGE, IMAGE_TAG).exec(); @@ -127,19 +127,19 @@ public class ActuatorEndpointIT { private static V1Deployment getCoreK8sClientItDeployment() throws Exception { V1Deployment deployment = (V1Deployment) k8SUtils - .readYamlFromClasspath("spring-cloud-kubernetes-core-k8s-client-it-deployment.yaml"); + .readYamlFromClasspath("spring-cloud-kubernetes-core-k8s-client-it-deployment.yaml"); return deployment; } private static V1Service getCoreK8sClientItService() throws Exception { V1Service service = (V1Service) k8SUtils - .readYamlFromClasspath("spring-cloud-kubernetes-core-k8s-client-it-service.yaml"); + .readYamlFromClasspath("spring-cloud-kubernetes-core-k8s-client-it-service.yaml"); return service; } private static NetworkingV1beta1Ingress getCoreK8sClientItIngress() throws Exception { NetworkingV1beta1Ingress ingress = (NetworkingV1beta1Ingress) k8SUtils - .readYamlFromClasspath("spring-cloud-kubernetes-core-k8s-client-it-ingress.yaml"); + .readYamlFromClasspath("spring-cloud-kubernetes-core-k8s-client-it-ingress.yaml"); return ingress; } @@ -163,13 +163,14 @@ public class ActuatorEndpointIT { } }); - //Sometimes the NGINX ingress takes a bit to catch up and realize the service is available and we get a 503, we just need to wait a bit + // Sometimes the NGINX ingress takes a bit to catch up and realize the service is + // available and we get a 503, we just need to wait a bit await().timeout(Duration.ofSeconds(60)) - .until(() -> rest.getForEntity("http://localhost:80/core-k8s-client-it/actuator/health", String.class) - .getStatusCode().is2xxSuccessful()); + .until(() -> rest.getForEntity("http://localhost:80/core-k8s-client-it/actuator/health", String.class) + .getStatusCode().is2xxSuccessful()); Map health = rest.getForObject("http://localhost:80/core-k8s-client-it/actuator/health", - Map.class); + Map.class); Map components = (Map) health.get("components"); assertThat(components.containsKey("kubernetes")).isTrue(); Map kubernetes = (Map) components.get("kubernetes"); @@ -189,7 +190,6 @@ public class ActuatorEndpointIT { public void testInfo() { RestTemplate rest = new RestTemplateBuilder().build(); - rest.setErrorHandler(new ResponseErrorHandler() { @Override public boolean hasError(ClientHttpResponse clientHttpResponse) throws IOException { @@ -206,10 +206,11 @@ public class ActuatorEndpointIT { } }); - //Sometimes the NGINX ingress takes a bit to catch up and realize the service is available and we get a 503, we just need to wait a bit + // Sometimes the NGINX ingress takes a bit to catch up and realize the service is + // available and we get a 503, we just need to wait a bit await().timeout(Duration.ofSeconds(60)) - .until(() -> rest.getForEntity("http://localhost:80/core-k8s-client-it/actuator/info", String.class) - .getStatusCode().is2xxSuccessful()); + .until(() -> rest.getForEntity("http://localhost:80/core-k8s-client-it/actuator/info", String.class) + .getStatusCode().is2xxSuccessful()); Map info = rest.getForObject("http://localhost:80/core-k8s-client-it/actuator/info", Map.class); Map kubernetes = (Map) info.get("kubernetes"); @@ -225,7 +226,7 @@ public class ActuatorEndpointIT { @AfterClass public static void after() throws Exception { appsApi.deleteCollectionNamespacedDeployment(NAMESPACE, null, null, null, - "metadata.name=" + K8S_CONFIG_CLIENT_IT_NAME, null, null, null, null, null, null, null, null); + "metadata.name=" + K8S_CONFIG_CLIENT_IT_NAME, null, null, null, null, null, null, null, null); api.deleteNamespacedService(K8S_CONFIG_CLIENT_IT_SERVICE_NAME, NAMESPACE, null, null, null, null, null, null); networkingApi.deleteNamespacedIngress("it-ingress", NAMESPACE, null, null, null, null, null, null); } diff --git a/spring-cloud-kubernetes-loadbalancer/pom.xml b/spring-cloud-kubernetes-loadbalancer/pom.xml index d564c118..788ab830 100644 --- a/spring-cloud-kubernetes-loadbalancer/pom.xml +++ b/spring-cloud-kubernetes-loadbalancer/pom.xml @@ -19,7 +19,7 @@ org.springframework.cloud - spring-cloud-kubernetes-discovery + spring-cloud-kubernetes-fabric8-discovery commons-lang diff --git a/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerAutoConfiguration.java b/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerAutoConfiguration.java index c7810b4a..510bde5a 100644 --- a/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerAutoConfiguration.java +++ b/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerAutoConfiguration.java @@ -19,7 +19,7 @@ package org.springframework.cloud.kubernetes.loadbalancer; 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.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerClientConfiguration.java b/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerClientConfiguration.java index 8a6e1af6..73b93a37 100644 --- a/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerClientConfiguration.java +++ b/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerClientConfiguration.java @@ -19,7 +19,7 @@ package org.springframework.cloud.kubernetes.loadbalancer; import io.fabric8.kubernetes.client.KubernetesClient; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; diff --git a/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceInstanceMapper.java b/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceInstanceMapper.java index b0993316..6e3b6b77 100644 --- a/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceInstanceMapper.java +++ b/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceInstanceMapper.java @@ -27,8 +27,8 @@ 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.discovery.KubernetesDiscoveryProperties; -import org.springframework.cloud.kubernetes.discovery.KubernetesServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; /** * Class for mapping Kubernetes Service object into {@link KubernetesServiceInstance}. diff --git a/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServicesListSupplier.java b/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServicesListSupplier.java index 9cb289a6..37e873a0 100644 --- a/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServicesListSupplier.java +++ b/spring-cloud-kubernetes-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServicesListSupplier.java @@ -25,7 +25,7 @@ import org.apache.commons.lang.StringUtils; import reactor.core.publisher.Flux; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; +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; diff --git a/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerAutoConfigurationTests.java b/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerAutoConfigurationTests.java index 39d01898..78337d22 100644 --- a/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerAutoConfigurationTests.java +++ b/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesLoadBalancerAutoConfigurationTests.java @@ -20,7 +20,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.context.ConfigurableApplicationContext; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceInstanceMapperTests.java b/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceInstanceMapperTests.java index 99f68058..ed9d0ea1 100644 --- a/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceInstanceMapperTests.java +++ b/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceInstanceMapperTests.java @@ -29,8 +29,8 @@ import io.fabric8.kubernetes.api.model.ServicePortBuilder; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; -import org.springframework.cloud.kubernetes.discovery.KubernetesServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; class KubernetesServiceInstanceMapperTests { diff --git a/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceListSupplierTests.java b/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceListSupplierTests.java index d1799cea..8bf0f722 100644 --- a/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceListSupplierTests.java +++ b/spring-cloud-kubernetes-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/loadbalancer/KubernetesServiceListSupplierTests.java @@ -36,8 +36,8 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.kubernetes.discovery.KubernetesDiscoveryProperties; -import org.springframework.cloud.kubernetes.discovery.KubernetesServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; import org.springframework.core.env.Environment; import static org.mockito.ArgumentMatchers.any; diff --git a/spring-cloud-starter-kubernetes-all/pom.xml b/spring-cloud-starter-kubernetes-all/pom.xml index 8e3a9909..585d8780 100644 --- a/spring-cloud-starter-kubernetes-all/pom.xml +++ b/spring-cloud-starter-kubernetes-all/pom.xml @@ -43,7 +43,7 @@ org.springframework.cloud - spring-cloud-kubernetes-discovery + spring-cloud-kubernetes-fabric8-discovery diff --git a/spring-cloud-starter-kubernetes-client-all/pom.xml b/spring-cloud-starter-kubernetes-client-all/pom.xml index 608c03cf..18c42bb7 100644 --- a/spring-cloud-starter-kubernetes-client-all/pom.xml +++ b/spring-cloud-starter-kubernetes-client-all/pom.xml @@ -20,6 +20,10 @@ org.springframework.cloud spring-cloud-kubernetes-client-config + + org.springframework.cloud + spring-cloud-kubernetes-client-discovery + diff --git a/spring-cloud-starter-kubernetes/pom.xml b/spring-cloud-starter-kubernetes/pom.xml index 3b6461c8..18961677 100644 --- a/spring-cloud-starter-kubernetes/pom.xml +++ b/spring-cloud-starter-kubernetes/pom.xml @@ -42,7 +42,7 @@ org.springframework.cloud - spring-cloud-kubernetes-discovery + spring-cloud-kubernetes-fabric8-discovery