From 8c4400628ead44231511f504124a64566b187ade Mon Sep 17 00:00:00 2001 From: buildmaster Date: Wed, 17 Jan 2024 21:41:08 +0000 Subject: [PATCH 1/2] Bumping versions --- ...atchAutoConfigurationApplicationContextTests.java | 7 ++++--- ...KubernetesCatalogWatchAutoConfigurationTests.java | 12 ++++++------ ...atchAutoConfigurationApplicationContextTests.java | 7 ++++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/catalog/KubernetesCatalogWatchAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/catalog/KubernetesCatalogWatchAutoConfigurationApplicationContextTests.java index 189c8e25..cd54467c 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/catalog/KubernetesCatalogWatchAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/catalog/KubernetesCatalogWatchAutoConfigurationApplicationContextTests.java @@ -98,7 +98,7 @@ class KubernetesCatalogWatchAutoConfigurationApplicationContextTests { @Test void disableBlockingEnableReactive() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.discovery.reactive.enabled=true"); + "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.discovery.reactive.enabled=true"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesCatalogWatch.class); }); @@ -110,14 +110,15 @@ class KubernetesCatalogWatchAutoConfigurationApplicationContextTests { @Test void enableBlockingDisableReactive() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=true", "spring.cloud.discovery.reactive.enabled=false"); + "spring.cloud.discovery.blocking.enabled=true", "spring.cloud.discovery.reactive.enabled=false"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesCatalogWatch.class); }); } /** - * spring.cloud.kubernetes.discovery.enabled is false, catalog watcher is disabled also. + * spring.cloud.kubernetes.discovery.enabled is false, catalog watcher is disabled + * also. */ @Test void disableKubernetesDiscovery() { diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchAutoConfigurationTests.java b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchAutoConfigurationTests.java index 5efe9da0..92fd4049 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchAutoConfigurationTests.java +++ b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesCatalogWatchAutoConfigurationTests.java @@ -97,9 +97,9 @@ class KubernetesCatalogWatchAutoConfigurationTests { @Test void disableBlockingEnableReactive() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.discovery.reactive.enabled=true", - "spring.cloud.kubernetes.discovery.discovery-server-url=example.com", - "spring.cloud.kubernetes.http.discovery.catalog.watcher.enabled=true"); + "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.discovery.reactive.enabled=true", + "spring.cloud.kubernetes.discovery.discovery-server-url=example.com", + "spring.cloud.kubernetes.http.discovery.catalog.watcher.enabled=true"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesCatalogWatch.class); }); @@ -111,9 +111,9 @@ class KubernetesCatalogWatchAutoConfigurationTests { @Test void enableBlockingDisableReactive() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=true", "spring.cloud.discovery.reactive.enabled=false", - "spring.cloud.kubernetes.discovery.discovery-server-url=example.com", - "spring.cloud.kubernetes.http.discovery.catalog.watcher.enabled=true"); + "spring.cloud.discovery.blocking.enabled=true", "spring.cloud.discovery.reactive.enabled=false", + "spring.cloud.kubernetes.discovery.discovery-server-url=example.com", + "spring.cloud.kubernetes.http.discovery.catalog.watcher.enabled=true"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesCatalogWatch.class); }); diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchAutoConfigurationApplicationContextTests.java index ec179944..0978a6b6 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesCatalogWatchAutoConfigurationApplicationContextTests.java @@ -90,7 +90,7 @@ class KubernetesCatalogWatchAutoConfigurationApplicationContextTests { @Test void disableBlockingEnableReactive() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.discovery.reactive.enabled=true"); + "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.discovery.reactive.enabled=true"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesCatalogWatch.class); assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class); @@ -105,7 +105,7 @@ class KubernetesCatalogWatchAutoConfigurationApplicationContextTests { @Test void enableBlockingDisableReactive() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=true", "spring.cloud.discovery.reactive.enabled=false"); + "spring.cloud.discovery.blocking.enabled=true", "spring.cloud.discovery.reactive.enabled=false"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesCatalogWatch.class); assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class); @@ -115,7 +115,8 @@ class KubernetesCatalogWatchAutoConfigurationApplicationContextTests { } /** - * spring.cloud.kubernetes.discovery.enabled is false, catalog watcher is disabled also. + * spring.cloud.kubernetes.discovery.enabled is false, catalog watcher is disabled + * also. */ @Test void disableKubernetesDiscovery() { From 3cb593221230240a6a5cd520f8624bc1ce511d47 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Tue, 23 Jan 2024 10:00:19 -0500 Subject: [PATCH 2/2] Use propertyresolver revert function (#1565) * Bumping versions * Remove function and use PropertyResolved Co-authored-by: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> --- ...ernetesClientConfigServerBootstrapper.java | 120 +++++++----------- .../commons/KubernetesNamespaceProvider.java | 55 ++++---- .../KubernetesConfigServerBootstrapper.java | 29 +++++ .../Fabric8ConfigServerBootstrapper.java | 83 ++++-------- ...ernetesClientServicesFunctionProvider.java | 7 +- 5 files changed, 140 insertions(+), 154 deletions(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientConfigServerBootstrapper.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientConfigServerBootstrapper.java index 41c16d67..6976d081 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientConfigServerBootstrapper.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientConfigServerBootstrapper.java @@ -17,7 +17,6 @@ package org.springframework.cloud.kubernetes.client.discovery; import java.util.Collections; -import java.util.List; import io.kubernetes.client.informer.SharedIndexInformer; import io.kubernetes.client.informer.SharedInformerFactory; @@ -30,19 +29,16 @@ import io.kubernetes.client.openapi.models.V1ServiceList; import io.kubernetes.client.util.Namespaces; import io.kubernetes.client.util.generic.GenericKubernetesApi; import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; -import org.springframework.boot.BootstrapContext; import org.springframework.boot.BootstrapRegistry; -import org.springframework.boot.context.properties.bind.BindHandler; -import org.springframework.boot.context.properties.bind.Bindable; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.config.client.ConfigServerConfigDataLocationResolver; +import org.springframework.cloud.config.client.ConfigServerConfigDataLocationResolver.PropertyResolver; import org.springframework.cloud.config.client.ConfigServerInstanceProvider; import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration; import org.springframework.cloud.kubernetes.commons.KubernetesClientProperties; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; import org.springframework.cloud.kubernetes.commons.config.KubernetesConfigServerBootstrapper; -import org.springframework.cloud.kubernetes.commons.config.KubernetesConfigServerInstanceProvider; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.core.env.AbstractEnvironment; import org.springframework.core.env.Environment; @@ -54,65 +50,45 @@ import static org.springframework.cloud.kubernetes.client.KubernetesClientUtils. */ class KubernetesClientConfigServerBootstrapper extends KubernetesConfigServerBootstrapper { + private static final Log LOG = LogFactory.getLog(KubernetesClientConfigServerBootstrapper.class); + @Override public void initialize(BootstrapRegistry registry) { if (hasConfigServerInstanceProvider()) { return; } - // We need to pass a lambda here rather than create a new instance of - // ConfigServerInstanceProvider.Function - // or else we will get ClassNotFoundExceptions if Spring Cloud Config is not on - // the classpath - registry.registerIfAbsent(ConfigServerInstanceProvider.Function.class, KubernetesFunction::create); - } - - final static class KubernetesFunction implements ConfigServerInstanceProvider.Function { - - private final BootstrapContext context; - - private KubernetesFunction(BootstrapContext context) { - this.context = context; - } - - static KubernetesFunction create(BootstrapContext context) { - return new KubernetesFunction(context); - } - - @Override - public List apply(String serviceId, Binder binder, BindHandler bindHandler, Log log) { - if (binder == null || bindHandler == null || !getDiscoveryEnabled(binder, bindHandler)) { - // If we don't have the Binder or BinderHandler from the - // ConfigDataLocationResolverContext - // we won't be able to create the necessary configuration - // properties to configure the - // Kubernetes DiscoveryClient - return Collections.emptyList(); + registry.registerIfAbsent(KubernetesDiscoveryProperties.class, context -> { + if (!getDiscoveryEnabled(context)) { + return null; } - KubernetesDiscoveryProperties discoveryProperties = createKubernetesDiscoveryProperties(binder, - bindHandler); - KubernetesClientProperties clientProperties = createKubernetesClientProperties(binder, bindHandler); - return getInstanceProvider(discoveryProperties, clientProperties, context, binder, bindHandler, log) - .getInstances(serviceId); - } + return createKubernetesDiscoveryProperties(context); + }); - private KubernetesConfigServerInstanceProvider getInstanceProvider( - KubernetesDiscoveryProperties discoveryProperties, KubernetesClientProperties clientProperties, - BootstrapContext context, Binder binder, BindHandler bindHandler, Log log) { + registry.registerIfAbsent(KubernetesClientProperties.class, context -> { + if (!getDiscoveryEnabled(context)) { + return null; + } + return createKubernetesClientProperties(context); + }); + registry.registerIfAbsent(ConfigServerInstanceProvider.Function.class, context -> { + if (!getDiscoveryEnabled(context)) { + return (id) -> Collections.emptyList(); + } if (context.isRegistered(KubernetesInformerDiscoveryClient.class)) { KubernetesInformerDiscoveryClient client = context.get(KubernetesInformerDiscoveryClient.class); return client::getInstances; } else { - + PropertyResolver propertyResolver = getPropertyResolver(context); ApiClient defaultApiClient = kubernetesApiClient(); - defaultApiClient.setUserAgent(binder.bind("spring.cloud.kubernetes.client.user-agent", String.class) - .orElse(KubernetesClientProperties.DEFAULT_USER_AGENT)); + defaultApiClient.setUserAgent(propertyResolver.get("spring.cloud.kubernetes.client.user-agent", + String.class, KubernetesClientProperties.DEFAULT_USER_AGENT)); KubernetesClientAutoConfiguration clientAutoConfiguration = new KubernetesClientAutoConfiguration(); ApiClient apiClient = context.getOrElseSupply(ApiClient.class, () -> defaultApiClient); KubernetesNamespaceProvider kubernetesNamespaceProvider = clientAutoConfiguration - .kubernetesNamespaceProvider(getNamespaceEnvironment(binder, bindHandler)); - + .kubernetesNamespaceProvider(getNamespaceEnvironment(propertyResolver)); + KubernetesDiscoveryProperties discoveryProperties = context.get(KubernetesDiscoveryProperties.class); String namespace = getInformerNamespace(kubernetesNamespaceProvider, discoveryProperties); SharedInformerFactory sharedInformerFactory = new SharedInformerFactory(apiClient); GenericKubernetesApi servicesApi = new GenericKubernetesApi<>(V1Service.class, @@ -133,40 +109,32 @@ class KubernetesClientConfigServerBootstrapper extends KubernetesConfigServerBoo return discoveryClient::getInstances; } catch (Exception e) { - if (log != null) { - log.warn("Error initiating informer discovery client", e); - } + LOG.warn("Error initiating informer discovery client", e); return (serviceId) -> Collections.emptyList(); } finally { sharedInformerFactory.stopAllRegisteredInformers(); } } - } - - private String getInformerNamespace(KubernetesNamespaceProvider kubernetesNamespaceProvider, - KubernetesDiscoveryProperties discoveryProperties) { - return discoveryProperties.allNamespaces() ? Namespaces.NAMESPACE_ALL - : kubernetesNamespaceProvider.getNamespace() == null ? Namespaces.NAMESPACE_DEFAULT - : kubernetesNamespaceProvider.getNamespace(); - } - - private Environment getNamespaceEnvironment(Binder binder, BindHandler bindHandler) { - return new AbstractEnvironment() { - @Override - public String getProperty(String key) { - return binder.bind(key, Bindable.of(String.class), bindHandler).orElse(super.getProperty(key)); - } - }; - } - - // This method should never be called, but is there for backward - // compatibility purposes - @Override - public List apply(String serviceId) { - return apply(serviceId, null, null, null); - } + }); } + private String getInformerNamespace(KubernetesNamespaceProvider kubernetesNamespaceProvider, + KubernetesDiscoveryProperties discoveryProperties) { + return discoveryProperties.allNamespaces() ? Namespaces.NAMESPACE_ALL + : kubernetesNamespaceProvider.getNamespace() == null ? Namespaces.NAMESPACE_DEFAULT + : kubernetesNamespaceProvider.getNamespace(); + } + + private Environment getNamespaceEnvironment( + ConfigServerConfigDataLocationResolver.PropertyResolver propertyResolver) { + return new AbstractEnvironment() { + @Override + public String getProperty(String key) { + return propertyResolver.get(key, String.class, super.getProperty(key)); + } + }; + } + } diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/KubernetesNamespaceProvider.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/KubernetesNamespaceProvider.java index fa8d2ab4..9d639d92 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/KubernetesNamespaceProvider.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/KubernetesNamespaceProvider.java @@ -35,8 +35,6 @@ import static org.springframework.cloud.kubernetes.commons.KubernetesClientPrope */ public class KubernetesNamespaceProvider { - private static final DeferredLog LOG = new DeferredLog(); - /** * Property name for namespace. */ @@ -47,6 +45,10 @@ public class KubernetesNamespaceProvider { */ public static final String NAMESPACE_PATH_PROPERTY = "spring.cloud.kubernetes.client.serviceAccountNamespacePath"; + private static final DeferredLog LOG = new DeferredLog(); + + private String namespacePropertyValue; + private BindHandler bindHandler; private String serviceAccountNamespace; @@ -65,7 +67,36 @@ public class KubernetesNamespaceProvider { this.bindHandler = bindHandler; } + public KubernetesNamespaceProvider(String namespacePropertyValue) { + this.namespacePropertyValue = namespacePropertyValue; + } + + public static String getNamespaceFromServiceAccountFile(String path) { + String namespace = null; + LOG.debug("Looking for service account namespace at: [" + path + "]."); + Path serviceAccountNamespacePath = Paths.get(path); + boolean serviceAccountNamespaceExists = Files.isRegularFile(serviceAccountNamespacePath); + if (serviceAccountNamespaceExists) { + LOG.debug("Found service account namespace at: [" + serviceAccountNamespacePath + "]."); + + try { + namespace = new String(Files.readAllBytes((serviceAccountNamespacePath))); + LOG.debug("Service account namespace value: " + serviceAccountNamespacePath); + } + catch (IOException ioe) { + LOG.error("Error reading service account namespace from: [" + serviceAccountNamespacePath + "].", ioe); + } + + } + return namespace; + } + public String getNamespace() { + // If they provided the namespace in the constructor just return that + if (!ObjectUtils.isEmpty(namespacePropertyValue)) { + return namespacePropertyValue; + } + // No namespace provided so try to get it from another source String namespace = null; if (environment != null) { namespace = environment.getProperty(NAMESPACE_PROPERTY); @@ -96,24 +127,4 @@ public class KubernetesNamespaceProvider { return serviceAccountNamespace; } - public static String getNamespaceFromServiceAccountFile(String path) { - String namespace = null; - LOG.debug("Looking for service account namespace at: [" + path + "]."); - Path serviceAccountNamespacePath = Paths.get(path); - boolean serviceAccountNamespaceExists = Files.isRegularFile(serviceAccountNamespacePath); - if (serviceAccountNamespaceExists) { - LOG.debug("Found service account namespace at: [" + serviceAccountNamespacePath + "]."); - - try { - namespace = new String(Files.readAllBytes((serviceAccountNamespacePath))); - LOG.debug("Service account namespace value: " + serviceAccountNamespacePath); - } - catch (IOException ioe) { - LOG.error("Error reading service account namespace from: [" + serviceAccountNamespacePath + "].", ioe); - } - - } - return namespace; - } - } diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigServerBootstrapper.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigServerBootstrapper.java index d9d38096..d804d2cc 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigServerBootstrapper.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/KubernetesConfigServerBootstrapper.java @@ -16,11 +16,14 @@ package org.springframework.cloud.kubernetes.commons.config; +import org.springframework.boot.BootstrapContext; import org.springframework.boot.BootstrapRegistryInitializer; import org.springframework.boot.context.properties.bind.BindHandler; import org.springframework.boot.context.properties.bind.Bindable; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.cloud.config.client.ConfigClientProperties; +import org.springframework.cloud.config.client.ConfigServerConfigDataLocationResolver; +import org.springframework.cloud.config.client.ConfigServerConfigDataLocationResolver.PropertyResolver; import org.springframework.cloud.kubernetes.commons.KubernetesClientProperties; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; @@ -41,14 +44,40 @@ public abstract class KubernetesConfigServerBootstrapper implements BootstrapReg bindHandler).orElseGet(() -> KubernetesDiscoveryProperties.DEFAULT); } + public static KubernetesDiscoveryProperties createKubernetesDiscoveryProperties(BootstrapContext bootstrapContext) { + PropertyResolver propertyResolver = getPropertyResolver(bootstrapContext); + return propertyResolver.resolveConfigurationProperties(KubernetesDiscoveryProperties.PREFIX, + KubernetesDiscoveryProperties.class, () -> KubernetesDiscoveryProperties.DEFAULT); + } + public static KubernetesClientProperties createKubernetesClientProperties(Binder binder, BindHandler bindHandler) { return binder.bindOrCreate(KubernetesClientProperties.PREFIX, Bindable.of(KubernetesClientProperties.class)) .withNamespace(new KubernetesNamespaceProvider(binder, bindHandler).getNamespace()); } + public static KubernetesClientProperties createKubernetesClientProperties(BootstrapContext bootstrapContext) { + PropertyResolver propertyResolver = getPropertyResolver(bootstrapContext); + return getPropertyResolver(bootstrapContext) + .resolveOrCreateConfigurationProperties(KubernetesClientProperties.PREFIX, + KubernetesClientProperties.class) + .withNamespace( + propertyResolver.get(KubernetesNamespaceProvider.NAMESPACE_PROPERTY, String.class, null)); + } + public static Boolean getDiscoveryEnabled(Binder binder, BindHandler bindHandler) { return binder.bind(ConfigClientProperties.CONFIG_DISCOVERY_ENABLED, Bindable.of(Boolean.class), bindHandler) .orElse(false); } + public static Boolean getDiscoveryEnabled(BootstrapContext bootstrapContext) { + return getPropertyResolver(bootstrapContext).get(ConfigClientProperties.CONFIG_DISCOVERY_ENABLED, Boolean.class, + false); + } + + protected static PropertyResolver getPropertyResolver(BootstrapContext context) { + return context.getOrElseSupply(ConfigServerConfigDataLocationResolver.PropertyResolver.class, + () -> new ConfigServerConfigDataLocationResolver.PropertyResolver(context.get(Binder.class), + context.getOrElse(BindHandler.class, null))); + } + } diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8ConfigServerBootstrapper.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8ConfigServerBootstrapper.java index 67cf0494..79b99aad 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8ConfigServerBootstrapper.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8ConfigServerBootstrapper.java @@ -17,21 +17,16 @@ package org.springframework.cloud.kubernetes.fabric8.discovery; import java.util.Collections; -import java.util.List; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; -import org.apache.commons.logging.Log; -import org.springframework.boot.BootstrapContext; import org.springframework.boot.BootstrapRegistry; -import org.springframework.boot.context.properties.bind.BindHandler; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.config.client.ConfigServerConfigDataLocationResolver.PropertyResolver; import org.springframework.cloud.config.client.ConfigServerInstanceProvider; import org.springframework.cloud.kubernetes.commons.KubernetesClientProperties; +import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; import org.springframework.cloud.kubernetes.commons.config.KubernetesConfigServerBootstrapper; -import org.springframework.cloud.kubernetes.commons.config.KubernetesConfigServerInstanceProvider; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.ServicePortSecureResolver; import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration; @@ -46,68 +41,46 @@ class Fabric8ConfigServerBootstrapper extends KubernetesConfigServerBootstrapper if (hasConfigServerInstanceProvider()) { return; } - // We need to pass a lambda here rather than create a new instance of - // ConfigServerInstanceProvider.Function - // or else we will get ClassNotFoundExceptions if Spring Cloud Config is not on - // the classpath - registry.registerIfAbsent(ConfigServerInstanceProvider.Function.class, KubernetesFunction::create); - } - final static class KubernetesFunction implements ConfigServerInstanceProvider.Function { - - private final BootstrapContext context; - - private KubernetesFunction(BootstrapContext context) { - this.context = context; - } - - static KubernetesFunction create(BootstrapContext context) { - return new KubernetesFunction(context); - } - - @Override - public List apply(String serviceId, Binder binder, BindHandler bindHandler, Log log) { - if (binder == null || bindHandler == null || !getDiscoveryEnabled(binder, bindHandler)) { - // If we don't have the Binder or BinderHandler from the - // ConfigDataLocationResolverContext - // we won't be able to create the necessary configuration - // properties to configure the - // Kubernetes DiscoveryClient - return Collections.emptyList(); + registry.registerIfAbsent(KubernetesDiscoveryProperties.class, context -> { + if (!getDiscoveryEnabled(context)) { + return null; } - KubernetesDiscoveryProperties discoveryProperties = createKubernetesDiscoveryProperties(binder, - bindHandler); - KubernetesClientProperties clientProperties = createKubernetesClientProperties(binder, bindHandler); - return getInstanceProvider(discoveryProperties, clientProperties, context, binder, bindHandler) - .getInstances(serviceId); - } + return createKubernetesDiscoveryProperties(context); + }); - private KubernetesConfigServerInstanceProvider getInstanceProvider( - KubernetesDiscoveryProperties discoveryProperties, KubernetesClientProperties clientProperties, - BootstrapContext context, Binder binder, BindHandler bindHandler) { + registry.registerIfAbsent(KubernetesClientProperties.class, context -> { + if (!getDiscoveryEnabled(context)) { + return null; + } + return createKubernetesClientProperties(context); + }); + + // create instance provider + registry.registerIfAbsent(ConfigServerInstanceProvider.Function.class, context -> { + if (!getDiscoveryEnabled(context)) { + return (id) -> Collections.emptyList(); + } if (context.isRegistered(KubernetesDiscoveryClient.class)) { KubernetesDiscoveryClient client = context.get(KubernetesDiscoveryClient.class); return client::getInstances; } else { + PropertyResolver propertyResolver = getPropertyResolver(context); Fabric8AutoConfiguration fabric8AutoConfiguration = new Fabric8AutoConfiguration(); - Config config = fabric8AutoConfiguration.kubernetesClientConfig(clientProperties); + Config config = fabric8AutoConfiguration + .kubernetesClientConfig(context.get(KubernetesClientProperties.class)); KubernetesClient kubernetesClient = fabric8AutoConfiguration.kubernetesClient(config); + KubernetesDiscoveryProperties discoveryProperties = context.get(KubernetesDiscoveryProperties.class); KubernetesDiscoveryClient discoveryClient = new KubernetesDiscoveryClient(kubernetesClient, - discoveryProperties, KubernetesClientServicesFunctionProvider - .servicesFunction(discoveryProperties, binder, bindHandler), + discoveryProperties, + KubernetesClientServicesFunctionProvider.servicesFunction(discoveryProperties, + new KubernetesNamespaceProvider(propertyResolver + .get(KubernetesNamespaceProvider.NAMESPACE_PROPERTY, String.class, null))), null, new ServicePortSecureResolver(discoveryProperties)); return discoveryClient::getInstances; } - } - - // This method should never be called, but is there for backward - // compatibility purposes - @Override - public List apply(String serviceId) { - return apply(serviceId, null, null, null); - } - + }); } } diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesClientServicesFunctionProvider.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesClientServicesFunctionProvider.java index 820d3a3f..07cbf1a8 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesClientServicesFunctionProvider.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/KubernetesClientServicesFunctionProvider.java @@ -48,6 +48,11 @@ public final class KubernetesClientServicesFunctionProvider { public static KubernetesClientServicesFunction servicesFunction(KubernetesDiscoveryProperties properties, Binder binder, BindHandler bindHandler) { + return servicesFunction(properties, new KubernetesNamespaceProvider(binder, bindHandler)); + } + + public static KubernetesClientServicesFunction servicesFunction(KubernetesDiscoveryProperties properties, + KubernetesNamespaceProvider namespaceProvider) { if (properties.allNamespaces()) { return (client) -> client.services().inAnyNamespace().withLabels(properties.serviceLabels()); @@ -55,7 +60,7 @@ public final class KubernetesClientServicesFunctionProvider { return client -> { String namespace = Fabric8Utils.getApplicationNamespace(client, null, "discovery-service", - new KubernetesNamespaceProvider(binder, bindHandler)); + namespaceProvider); return client.services().inNamespace(namespace).withLabels(properties.serviceLabels()); };