From 56715184e3483a8f573eecf024e6ba52518db446 Mon Sep 17 00:00:00 2001 From: wind57 Date: Sun, 12 Oct 2025 13:11:01 +0300 Subject: [PATCH 01/12] wip Signed-off-by: wind57 --- ...nditionalOnSelectiveNamespacesMissing.java | 62 ------- ...nditionalOnSelectiveNamespacesPresent.java | 62 ------- ...rnetesClientInformerAutoConfiguration.java | 135 +++++++++----- ...ormerDiscoveryClientAutoConfiguration.java | 17 -- ...ctiveDiscoveryClientAutoConfiguration.java | 48 ++--- ...rSelectiveNamespacesAutoConfiguration.java | 165 ------------------ ...oConfigurationApplicationContextTests.java | 4 +- ...oConfigurationApplicationContextTests.java | 5 +- ...ctiveNamespacesAutoConfigurationTests.java | 2 +- 9 files changed, 103 insertions(+), 397 deletions(-) delete mode 100644 spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesMissing.java delete mode 100644 spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesPresent.java delete mode 100644 spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfiguration.java diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesMissing.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesMissing.java deleted file mode 100644 index 2cf3c18c38..0000000000 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesMissing.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2013-present 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.Set; - -import org.apache.commons.logging.LogFactory; - -import org.springframework.boot.context.properties.bind.Bindable; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.context.annotation.ConfigurationCondition; -import org.springframework.core.log.LogAccessor; -import org.springframework.core.type.AnnotatedTypeMetadata; - -/** - * Conditional that checks if our discovery is _not_ based on selective namespaces, i.e.: - * 'spring.cloud.kubernetes.discovery.namespaces' is not set. - * - * @author wind57 - */ -final class ConditionalOnSelectiveNamespacesMissing implements ConfigurationCondition { - - private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(ConditionalOnSelectiveNamespacesMissing.class)); - - @Override - public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { - - Set selectiveNamespaces = Binder.get(context.getEnvironment()) - .bind("spring.cloud.kubernetes.discovery.namespaces", Bindable.setOf(String.class)) - .orElse(Set.of()); - boolean selectiveNamespacesMissing = selectiveNamespaces.isEmpty(); - if (selectiveNamespacesMissing) { - LOG.debug(() -> "selective namespaces not present"); - } - else { - LOG.debug(() -> "found selective namespaces : " + selectiveNamespaces.stream().sorted().toList()); - } - return selectiveNamespacesMissing; - } - - @Override - public ConfigurationPhase getConfigurationPhase() { - return ConfigurationPhase.REGISTER_BEAN; - } - -} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesPresent.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesPresent.java deleted file mode 100644 index 75a660bc26..0000000000 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesPresent.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2013-present 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.Set; - -import org.apache.commons.logging.LogFactory; - -import org.springframework.boot.context.properties.bind.Bindable; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.context.annotation.ConditionContext; -import org.springframework.context.annotation.ConfigurationCondition; -import org.springframework.core.log.LogAccessor; -import org.springframework.core.type.AnnotatedTypeMetadata; - -/** - * Conditional that checks if our discovery is based on selective namespaces, i.e.: - * 'spring.cloud.kubernetes.discovery.namespaces' is set. - * - * @author wind57 - */ -final class ConditionalOnSelectiveNamespacesPresent implements ConfigurationCondition { - - private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(ConditionalOnSelectiveNamespacesPresent.class)); - - @Override - public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { - - Set selectiveNamespaces = Binder.get(context.getEnvironment()) - .bind("spring.cloud.kubernetes.discovery.namespaces", Bindable.setOf(String.class)) - .orElse(Set.of()); - boolean selectiveNamespacesPresent = !selectiveNamespaces.isEmpty(); - if (selectiveNamespacesPresent) { - LOG.debug(() -> "found selective namespaces : " + selectiveNamespaces.stream().sorted().toList()); - } - else { - LOG.debug(() -> "selective namespaces not present"); - } - return selectiveNamespacesPresent; - } - - @Override - public ConfigurationCondition.ConfigurationPhase getConfigurationPhase() { - return ConfigurationPhase.REGISTER_BEAN; - } - -} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java index a7c1ba959f..a767bcb85b 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java @@ -16,6 +16,9 @@ package org.springframework.cloud.kubernetes.client.discovery; +import java.util.ArrayList; +import java.util.List; + import io.kubernetes.client.informer.SharedIndexInformer; import io.kubernetes.client.informer.SharedInformerFactory; import io.kubernetes.client.informer.cache.Lister; @@ -37,7 +40,6 @@ import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration; import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider; -import org.springframework.cloud.kubernetes.commons.config.NamespaceResolutionFailedException; import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnBlockingOrReactiveDiscoveryEnabled; import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnKubernetesDiscoveryEnabled; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; @@ -48,7 +50,6 @@ import org.springframework.core.log.LogAccessor; import static io.kubernetes.client.util.Namespaces.NAMESPACE_ALL; -import static io.kubernetes.client.util.Namespaces.NAMESPACE_DEFAULT; import static org.springframework.cloud.kubernetes.client.KubernetesClientUtils.getApplicationNamespace; /** @@ -59,79 +60,119 @@ @ConditionalOnKubernetesDiscoveryEnabled @ConditionalOnBlockingOrReactiveDiscoveryEnabled @ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES) -@Conditional(ConditionalOnSelectiveNamespacesMissing.class) @AutoConfigureBefore({ SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class }) @AutoConfigureAfter({ KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class }) final class KubernetesClientInformerAutoConfiguration { private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(KubernetesClientInformerAutoConfiguration.class)); + LogFactory.getLog(KubernetesClientInformerAutoConfiguration.class)); + // we rely on the order of namespaces to enable listers, as such provide a bean of + // namespaces as a list, instead of the incoming Set. @Bean - @ConditionalOnMissingBean - SharedInformerFactory sharedInformerFactory(ApiClient client) { - LOG.debug(() -> "registering sharedInformerFactory for non-selective namespaces"); - return new SharedInformerFactory(client); - } + List k8sDiscoveryClientNamespaces(KubernetesDiscoveryProperties properties, + KubernetesNamespaceProvider provider) { - @Bean - String kubernetesClientNamespace(KubernetesDiscoveryProperties properties, KubernetesNamespaceProvider provider) { - String namespace; if (properties.allNamespaces()) { - namespace = NAMESPACE_ALL; LOG.debug(() -> "serviceSharedInformer will use all-namespaces"); + return List.of(NAMESPACE_ALL); } - else { - try { - namespace = getApplicationNamespace(null, "kubernetes client discovery", provider); - } - catch (NamespaceResolutionFailedException ex) { - LOG.warn(() -> "failed to resolve namespace, defaulting to :" + NAMESPACE_DEFAULT - + ". This will fail in a future release."); - namespace = NAMESPACE_DEFAULT; - } - LOG.debug("serviceSharedInformer will use namespace : " + namespace); + + if (properties.namespaces() != null && !properties.namespaces().isEmpty()) { + List selectiveNamespaces = properties.namespaces().stream().sorted().toList(); + LOG.debug(() -> "serviceSharedInformers will use selective namespaces : " + selectiveNamespaces); + return selectiveNamespaces; } - return namespace; + String namespace = getApplicationNamespace(null, "kubernetes client discovery", provider); + LOG.debug(() -> "using namespace : " + namespace); + return List.of(namespace); } @Bean - @ConditionalOnMissingBean(value = V1Service.class, parameterizedContainer = SharedIndexInformer.class) - SharedIndexInformer servicesSharedIndexInformer(SharedInformerFactory sharedInformerFactory, - ApiClient apiClient, String kubernetesClientNamespace) { + @ConditionalOnMissingBean(value = SharedInformerFactory.class, parameterizedContainer = List.class) + List sharedInformerFactories(ApiClient apiClient, List selectiveNamespaces) { - GenericKubernetesApi servicesApi = new GenericKubernetesApi<>(V1Service.class, - V1ServiceList.class, "", "v1", "services", apiClient); - - return sharedInformerFactory.sharedIndexInformerFor(servicesApi, V1Service.class, 0L, - kubernetesClientNamespace); + int howManyNamespaces = selectiveNamespaces.size(); + List sharedInformerFactories = new ArrayList<>(howManyNamespaces); + for (int i = 0; i < howManyNamespaces; ++i) { + sharedInformerFactories.add(new SharedInformerFactory(apiClient)); + } + return sharedInformerFactories; } @Bean - @ConditionalOnMissingBean(value = V1Endpoints.class, parameterizedContainer = SharedIndexInformer.class) - SharedIndexInformer endpointsSharedIndexInformer(SharedInformerFactory sharedInformerFactory, - ApiClient apiClient, String kubernetesClientNamespace) { + @ConditionalOnMissingBean(value = V1Service.class, + parameterizedContainer = { List.class, SharedIndexInformer.class }) + List> serviceSharedIndexInformers( + List sharedInformerFactories, List selectiveNamespaces, + ApiClient apiClient) { + + int howManyNamespaces = selectiveNamespaces.size(); + List> serviceSharedIndexedInformers = new ArrayList<>(howManyNamespaces); + for (int i = 0; i < howManyNamespaces; ++i) { + GenericKubernetesApi servicesApi = new GenericKubernetesApi<>(V1Service.class, + V1ServiceList.class, "", "v1", "services", apiClient); + SharedIndexInformer sharedIndexInformer = sharedInformerFactories.get(i) + .sharedIndexInformerFor(servicesApi, V1Service.class, 0L, selectiveNamespaces.get(i)); + serviceSharedIndexedInformers.add(sharedIndexInformer); + } + return serviceSharedIndexedInformers; + } - GenericKubernetesApi servicesApi = new GenericKubernetesApi<>(V1Endpoints.class, - V1EndpointsList.class, "", "v1", "endpoints", apiClient); + @Bean + @ConditionalOnMissingBean(value = V1Service.class, parameterizedContainer = { List.class, Lister.class }) + List> serviceListers(List selectiveNamespaces, + List> serviceSharedIndexInformers) { + + int howManyNamespaces = selectiveNamespaces.size(); + List> serviceListers = new ArrayList<>(howManyNamespaces); + + for (int i = 0; i < howManyNamespaces; ++i) { + String namespace = selectiveNamespaces.get(i); + Lister lister = new Lister<>(serviceSharedIndexInformers.get(i).getIndexer(), namespace); + LOG.debug(() -> "registering lister (for services) in namespace : " + namespace); + serviceListers.add(lister); + } - return sharedInformerFactory.sharedIndexInformerFor(servicesApi, V1Endpoints.class, 0L, - kubernetesClientNamespace); + return serviceListers; } @Bean - @ConditionalOnMissingBean(value = V1Service.class, parameterizedContainer = Lister.class) - Lister servicesLister(SharedIndexInformer servicesSharedIndexInformer, - String kubernetesClientNamespace) { - return new Lister<>(servicesSharedIndexInformer.getIndexer(), kubernetesClientNamespace); + @ConditionalOnMissingBean(value = V1Endpoints.class, + parameterizedContainer = { List.class, SharedIndexInformer.class }) + List> endpointsSharedIndexInformers( + List sharedInformerFactories, List selectiveNamespaces, + ApiClient apiClient) { + + int howManyNamespaces = selectiveNamespaces.size(); + List> endpointsSharedIndexedInformers = new ArrayList<>(howManyNamespaces); + for (int i = 0; i < howManyNamespaces; ++i) { + GenericKubernetesApi endpointsApi = new GenericKubernetesApi<>( + V1Endpoints.class, V1EndpointsList.class, "", "v1", "endpoints", apiClient); + SharedIndexInformer sharedIndexInformer = sharedInformerFactories.get(i) + .sharedIndexInformerFor(endpointsApi, V1Endpoints.class, 0L, selectiveNamespaces.get(i)); + endpointsSharedIndexedInformers.add(sharedIndexInformer); + } + return endpointsSharedIndexedInformers; } @Bean - @ConditionalOnMissingBean(value = V1Endpoints.class, parameterizedContainer = Lister.class) - Lister endpointsLister(SharedIndexInformer endpointsSharedIndexInformer, - String kubernetesClientNamespace) { - return new Lister<>(endpointsSharedIndexInformer.getIndexer(), kubernetesClientNamespace); + @ConditionalOnMissingBean(value = V1Endpoints.class, parameterizedContainer = { List.class, Lister.class }) + List> endpointsListers(List selectiveNamespaces, + List> serviceSharedIndexInformers) { + + int howManyNamespaces = selectiveNamespaces.size(); + List> endpointsListers = new ArrayList<>(howManyNamespaces); + + for (int i = 0; i < howManyNamespaces; ++i) { + String namespace = selectiveNamespaces.get(i); + Lister lister = new Lister<>(serviceSharedIndexInformers.get(i).getIndexer()); + LOG.debug(() -> "registering lister (for endpoints) in namespace : " + namespace); + endpointsListers.add(lister); + } + + return endpointsListers; } } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java index f322d2d159..30e0df6ada 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java @@ -37,7 +37,6 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; @@ -48,28 +47,12 @@ @ConditionalOnSpringCloudKubernetesBlockingDiscovery @AutoConfigureBefore({ SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class }) @AutoConfigureAfter({ KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, - KubernetesClientInformerAutoConfiguration.class, - KubernetesClientInformerSelectiveNamespacesAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class }) @Import(KubernetesDiscoveryClientHealthConfiguration.class) final class KubernetesClientInformerDiscoveryClientAutoConfiguration { @Bean @ConditionalOnMissingBean - @Conditional(ConditionalOnSelectiveNamespacesMissing.class) - KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( - SharedInformerFactory sharedInformerFactory, Lister serviceLister, - Lister endpointsLister, SharedInformer serviceInformer, - SharedInformer endpointsInformer, KubernetesDiscoveryProperties properties, - CoreV1Api coreV1Api, Predicate predicate) { - return new KubernetesClientInformerDiscoveryClient(List.of(sharedInformerFactory), List.of(serviceLister), - List.of(endpointsLister), List.of(serviceInformer), List.of(endpointsInformer), properties, coreV1Api, - predicate); - } - - @Bean - @ConditionalOnMissingBean - @Conditional(ConditionalOnSelectiveNamespacesPresent.class) KubernetesClientInformerDiscoveryClient selectiveNamespacesKubernetesInformerDiscoveryClient( List sharedInformerFactories, List> serviceListers, List> endpointsListers, List> serviceInformers, diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java index 701c45f6ed..3a2eaa55ed 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java @@ -56,21 +56,27 @@ @AutoConfigureBefore({ SimpleReactiveDiscoveryClientAutoConfiguration.class, ReactiveCommonsClientAutoConfiguration.class }) @AutoConfigureAfter({ ReactiveCompositeDiscoveryClientAutoConfiguration.class, - KubernetesDiscoveryPropertiesAutoConfiguration.class, KubernetesClientInformerAutoConfiguration.class, - KubernetesClientInformerSelectiveNamespacesAutoConfiguration.class, + KubernetesDiscoveryPropertiesAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class }) final class KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration { private static final LogAccessor LOG = new LogAccessor( LogFactory.getLog(KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class)); + @Bean + @ConditionalOnMissingBean + KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscoveryClient( + KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { + return new KubernetesClientInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); + } + /** * Post an event so that health indicator is initialized. */ @Bean @ConditionalOnSpringCloudKubernetesReactiveDiscoveryHealthInitializer KubernetesDiscoveryClientHealthIndicatorInitializer reactiveIndicatorInitializer( - ApplicationEventPublisher applicationEventPublisher, PodUtils podUtils) { + ApplicationEventPublisher applicationEventPublisher, PodUtils podUtils) { LOG.debug(() -> "Will publish InstanceRegisteredEvent from reactive implementation"); return new KubernetesDiscoveryClientHealthIndicatorInitializer(podUtils, applicationEventPublisher); } @@ -81,41 +87,9 @@ KubernetesDiscoveryClientHealthIndicatorInitializer reactiveIndicatorInitializer @Bean @ConditionalOnSpringCloudKubernetesReactiveDiscoveryHealthInitializer ReactiveDiscoveryClientHealthIndicator kubernetesReactiveDiscoveryClientHealthIndicator( - KubernetesClientInformerReactiveDiscoveryClient client, - DiscoveryClientHealthIndicatorProperties properties) { + KubernetesClientInformerReactiveDiscoveryClient client, + DiscoveryClientHealthIndicatorProperties properties) { return new ReactiveDiscoveryClientHealthIndicator(client, properties); } - @Bean - @ConditionalOnMissingBean - KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscoveryClient( - KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { - return new KubernetesClientInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); - } - - @Bean - @ConditionalOnMissingBean - @Conditional(ConditionalOnSelectiveNamespacesMissing.class) - KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( - SharedInformerFactory sharedInformerFactory, Lister serviceLister, - Lister endpointsLister, SharedInformer serviceInformer, - SharedInformer endpointsInformer, KubernetesDiscoveryProperties properties, - CoreV1Api coreV1Api, Predicate predicate) { - return new KubernetesClientInformerDiscoveryClient(List.of(sharedInformerFactory), List.of(serviceLister), - List.of(endpointsLister), List.of(serviceInformer), List.of(endpointsInformer), properties, coreV1Api, - predicate); - } - - @Bean - @ConditionalOnMissingBean - @Conditional(ConditionalOnSelectiveNamespacesPresent.class) - KubernetesClientInformerDiscoveryClient selectiveNamespacesKubernetesClientInformerDiscoveryClient( - List sharedInformerFactories, List> serviceListers, - List> endpointsListers, List> serviceInformers, - List> endpointsInformers, KubernetesDiscoveryProperties properties, - CoreV1Api coreV1Api, Predicate predicate) { - return new KubernetesClientInformerDiscoveryClient(sharedInformerFactories, serviceListers, endpointsListers, - serviceInformers, endpointsInformers, properties, coreV1Api, predicate); - } - } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfiguration.java deleted file mode 100644 index ec8c18a421..0000000000 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfiguration.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright 2013-present 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.ArrayList; -import java.util.List; - -import io.kubernetes.client.informer.SharedIndexInformer; -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.util.generic.GenericKubernetesApi; -import org.apache.commons.logging.LogFactory; - -import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; -import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.cloud.CloudPlatform; -import org.springframework.cloud.client.CommonsClientAutoConfiguration; -import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; -import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; -import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration; -import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnBlockingOrReactiveDiscoveryEnabled; -import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnKubernetesDiscoveryEnabled; -import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; -import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; - -/** - * Auto-configuration to be used when "spring.cloud.kubernetes.discovery.namespaces" is - * defined. - * - * @author wind57 - */ -@Configuration(proxyBeanMethods = false) -@ConditionalOnDiscoveryEnabled -@ConditionalOnKubernetesDiscoveryEnabled -@ConditionalOnBlockingOrReactiveDiscoveryEnabled -@Conditional(ConditionalOnSelectiveNamespacesPresent.class) -@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES) -@AutoConfigureBefore({ SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class }) -@AutoConfigureAfter({ KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class }) -final class KubernetesClientInformerSelectiveNamespacesAutoConfiguration { - - private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(KubernetesClientInformerSelectiveNamespacesAutoConfiguration.class)); - - // we rely on the order of namespaces to enable listers, as such provide a bean of - // namespaces as a list, instead of the incoming Set. - @Bean - List selectiveNamespaces(KubernetesDiscoveryProperties properties) { - List selectiveNamespaces = properties.namespaces().stream().sorted().toList(); - LOG.debug(() -> "using selective namespaces : " + selectiveNamespaces); - return selectiveNamespaces; - } - - @Bean - @ConditionalOnMissingBean(value = SharedInformerFactory.class, parameterizedContainer = List.class) - List sharedInformerFactories(ApiClient apiClient, List selectiveNamespaces) { - - int howManyNamespaces = selectiveNamespaces.size(); - List sharedInformerFactories = new ArrayList<>(howManyNamespaces); - for (int i = 0; i < howManyNamespaces; ++i) { - sharedInformerFactories.add(new SharedInformerFactory(apiClient)); - } - return sharedInformerFactories; - } - - @Bean - @ConditionalOnMissingBean(value = V1Service.class, - parameterizedContainer = { List.class, SharedIndexInformer.class }) - List> serviceSharedIndexInformers( - List sharedInformerFactories, List selectiveNamespaces, - ApiClient apiClient) { - - int howManyNamespaces = selectiveNamespaces.size(); - List> serviceSharedIndexedInformers = new ArrayList<>(howManyNamespaces); - for (int i = 0; i < howManyNamespaces; ++i) { - GenericKubernetesApi servicesApi = new GenericKubernetesApi<>(V1Service.class, - V1ServiceList.class, "", "v1", "services", apiClient); - SharedIndexInformer sharedIndexInformer = sharedInformerFactories.get(i) - .sharedIndexInformerFor(servicesApi, V1Service.class, 0L, selectiveNamespaces.get(i)); - serviceSharedIndexedInformers.add(sharedIndexInformer); - } - return serviceSharedIndexedInformers; - } - - @Bean - @ConditionalOnMissingBean(value = V1Service.class, parameterizedContainer = { List.class, Lister.class }) - List> serviceListers(List selectiveNamespaces, - List> serviceSharedIndexInformers) { - - int howManyNamespaces = selectiveNamespaces.size(); - List> serviceListers = new ArrayList<>(howManyNamespaces); - - for (int i = 0; i < howManyNamespaces; ++i) { - String namespace = selectiveNamespaces.get(i); - Lister lister = new Lister<>(serviceSharedIndexInformers.get(i).getIndexer(), namespace); - LOG.debug(() -> "registering lister (for services) in namespace : " + namespace); - serviceListers.add(lister); - } - - return serviceListers; - } - - @Bean - @ConditionalOnMissingBean(value = V1Endpoints.class, - parameterizedContainer = { List.class, SharedIndexInformer.class }) - List> endpointsSharedIndexInformers( - List sharedInformerFactories, List selectiveNamespaces, - ApiClient apiClient) { - - int howManyNamespaces = selectiveNamespaces.size(); - List> endpointsSharedIndexedInformers = new ArrayList<>(howManyNamespaces); - for (int i = 0; i < howManyNamespaces; ++i) { - GenericKubernetesApi endpointsApi = new GenericKubernetesApi<>( - V1Endpoints.class, V1EndpointsList.class, "", "v1", "endpoints", apiClient); - SharedIndexInformer sharedIndexInformer = sharedInformerFactories.get(i) - .sharedIndexInformerFor(endpointsApi, V1Endpoints.class, 0L, selectiveNamespaces.get(i)); - endpointsSharedIndexedInformers.add(sharedIndexInformer); - } - return endpointsSharedIndexedInformers; - } - - @Bean - @ConditionalOnMissingBean(value = V1Endpoints.class, parameterizedContainer = { List.class, Lister.class }) - List> endpointsListers(List selectiveNamespaces, - List> serviceSharedIndexInformers) { - - int howManyNamespaces = selectiveNamespaces.size(); - List> endpointsListers = new ArrayList<>(howManyNamespaces); - - for (int i = 0; i < howManyNamespaces; ++i) { - String namespace = selectiveNamespaces.get(i); - Lister lister = new Lister<>(serviceSharedIndexInformers.get(i).getIndexer()); - LOG.debug(() -> "registering lister (for endpoints) in namespace : " + namespace); - endpointsListers.add(lister); - } - - return endpointsListers; - } - -} diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java index 556ae38ce6..cd8bf96806 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -428,7 +428,6 @@ private void setup(String... properties) { .withConfiguration(AutoConfigurations.of(KubernetesClientInformerDiscoveryClientAutoConfiguration.class, KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, KubernetesClientInformerAutoConfiguration.class, - KubernetesClientInformerSelectiveNamespacesAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) .withUserConfiguration(ApiClientConfig.class) .withPropertyValues(properties); @@ -438,8 +437,7 @@ private void setupWithFilteredClassLoader(Class cls, String... properties) { applicationContextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(KubernetesClientInformerDiscoveryClientAutoConfiguration.class, KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, - KubernetesClientInformerAutoConfiguration.class, - KubernetesClientInformerSelectiveNamespacesAutoConfiguration.class, + KubernetesClientInformerAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) .withClassLoader(new FilteredClassLoader(cls)) .withUserConfiguration(ApiClientConfig.class) diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index 4a3ce1920e..2172294f51 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -433,8 +433,8 @@ private void setup(String... properties) { KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class, KubernetesClientAutoConfiguration.class, SimpleReactiveDiscoveryClientAutoConfiguration.class, UtilAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, - KubernetesClientInformerSelectiveNamespacesAutoConfiguration.class, - KubernetesCommonsAutoConfiguration.class, KubernetesClientInformerAutoConfiguration.class, + KubernetesClientInformerAutoConfiguration.class, + KubernetesCommonsAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) .withUserConfiguration(ApiClientConfig.class) .withPropertyValues(properties); @@ -446,7 +446,6 @@ private void setupWithFilteredClassLoader(String name, String... properties) { KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class, KubernetesClientAutoConfiguration.class, SimpleReactiveDiscoveryClientAutoConfiguration.class, UtilAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, - KubernetesClientInformerSelectiveNamespacesAutoConfiguration.class, KubernetesCommonsAutoConfiguration.class, KubernetesClientInformerAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) .withUserConfiguration(ApiClientConfig.class) diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests.java index 2406a6d425..fe4c372b94 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests.java @@ -59,7 +59,7 @@ void testBeansCreates(CapturedOutput output) { "spring.cloud.kubernetes.discovery.namespaces[1]=" + NAMESPACE_B, "spring.main.cloud-platform=kubernetes") .withConfiguration( - AutoConfigurations.of(KubernetesClientInformerSelectiveNamespacesAutoConfiguration.class)) + AutoConfigurations.of(KubernetesClientInformerAutoConfiguration.class)) .withUserConfiguration(Config.class) .run(context -> { assertThat(context.getBean("selectiveNamespaces")).isNotNull(); From 03458e198f98d2070dd394bcb8c0ddd40d842d29 Mon Sep 17 00:00:00 2001 From: wind57 Date: Sun, 12 Oct 2025 18:19:34 +0300 Subject: [PATCH 02/12] wip Signed-off-by: wind57 --- ...rnetesClientInformerAutoConfiguration.java | 1 - ...ormerDiscoveryClientAutoConfiguration.java | 2 +- ...nalOnSelectiveNamespacesDisabledTests.java | 62 ------------------- ...onalOnSelectiveNamespacesEnabledTests.java | 61 ------------------ 4 files changed, 1 insertion(+), 125 deletions(-) delete mode 100644 spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesDisabledTests.java delete mode 100644 spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesEnabledTests.java diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java index a767bcb85b..dc15125921 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java @@ -45,7 +45,6 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.core.log.LogAccessor; diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java index 30e0df6ada..b8f7affbaa 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java @@ -53,7 +53,7 @@ final class KubernetesClientInformerDiscoveryClientAutoConfiguration { @Bean @ConditionalOnMissingBean - KubernetesClientInformerDiscoveryClient selectiveNamespacesKubernetesInformerDiscoveryClient( + KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( List sharedInformerFactories, List> serviceListers, List> endpointsListers, List> serviceInformers, List> endpointsInformers, KubernetesDiscoveryProperties properties, diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesDisabledTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesDisabledTests.java deleted file mode 100644 index 7a316b20c6..0000000000 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesDisabledTests.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2013-present 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.assertj.core.api.Assertions; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import org.springframework.context.annotation.ConditionContext; -import org.springframework.mock.env.MockEnvironment; - -/** - * @author wind57 - */ - -class ConditionalOnSelectiveNamespacesDisabledTests { - - private static final ConditionalOnSelectiveNamespacesMissing TO_TEST = new ConditionalOnSelectiveNamespacesMissing(); - - private static final ConditionContext CONDITION_CONTEXT = Mockito.mock(ConditionContext.class); - - @Test - void testSelectiveNamespacesNotPresent() { - MockEnvironment environment = new MockEnvironment(); - Mockito.when(CONDITION_CONTEXT.getEnvironment()).thenReturn(environment); - boolean result = TO_TEST.matches(CONDITION_CONTEXT, null); - Assertions.assertThat(result).isTrue(); - } - - @Test - void testSelectiveNamespacesPresentEmpty() { - MockEnvironment environment = new MockEnvironment(); - environment.setProperty("spring.cloud.kubernetes.discovery.namespaces", ""); - Mockito.when(CONDITION_CONTEXT.getEnvironment()).thenReturn(environment); - boolean result = TO_TEST.matches(CONDITION_CONTEXT, null); - Assertions.assertThat(result).isTrue(); - } - - @Test - void testSelectiveNamespacesPresentNonEmpty() { - MockEnvironment environment = new MockEnvironment(); - environment.setProperty("spring.cloud.kubernetes.discovery.namespaces", "default"); - Mockito.when(CONDITION_CONTEXT.getEnvironment()).thenReturn(environment); - boolean result = TO_TEST.matches(CONDITION_CONTEXT, null); - Assertions.assertThat(result).isFalse(); - } - -} diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesEnabledTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesEnabledTests.java deleted file mode 100644 index ae7e347f19..0000000000 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/ConditionalOnSelectiveNamespacesEnabledTests.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2013-present 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.assertj.core.api.Assertions; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -import org.springframework.context.annotation.ConditionContext; -import org.springframework.mock.env.MockEnvironment; - -/** - * @author wind57 - */ -class ConditionalOnSelectiveNamespacesEnabledTests { - - private static final ConditionalOnSelectiveNamespacesPresent TO_TEST = new ConditionalOnSelectiveNamespacesPresent(); - - private static final ConditionContext CONDITION_CONTEXT = Mockito.mock(ConditionContext.class); - - @Test - void testSelectiveNamespacesNotPresent() { - MockEnvironment environment = new MockEnvironment(); - Mockito.when(CONDITION_CONTEXT.getEnvironment()).thenReturn(environment); - boolean result = TO_TEST.matches(CONDITION_CONTEXT, null); - Assertions.assertThat(result).isFalse(); - } - - @Test - void testSelectiveNamespacesPresentEmpty() { - MockEnvironment environment = new MockEnvironment(); - environment.setProperty("spring.cloud.kubernetes.discovery.namespaces", ""); - Mockito.when(CONDITION_CONTEXT.getEnvironment()).thenReturn(environment); - boolean result = TO_TEST.matches(CONDITION_CONTEXT, null); - Assertions.assertThat(result).isFalse(); - } - - @Test - void testSelectiveNamespacesPresentNonEmpty() { - MockEnvironment environment = new MockEnvironment(); - environment.setProperty("spring.cloud.kubernetes.discovery.namespaces", "default"); - Mockito.when(CONDITION_CONTEXT.getEnvironment()).thenReturn(environment); - boolean result = TO_TEST.matches(CONDITION_CONTEXT, null); - Assertions.assertThat(result).isTrue(); - } - -} From 941d6d74699eb1ea33ac125136273273a9f9d887 Mon Sep 17 00:00:00 2001 From: wind57 Date: Sun, 12 Oct 2025 21:32:45 +0300 Subject: [PATCH 03/12] wip Signed-off-by: wind57 --- ...oConfigurationApplicationContextTests.java | 72 ++++++---------- ...oConfigurationApplicationContextTests.java | 65 +++++--------- .../client/discovery/TestUtils.java | 84 +------------------ 3 files changed, 47 insertions(+), 174 deletions(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java index cd8bf96806..dc29288b12 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -38,10 +38,7 @@ import org.springframework.context.annotation.Primary; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertNonSelectiveNamespacesBeansMissing; -import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertNonSelectiveNamespacesBeansPresent; -import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertSelectiveNamespacesBeansMissing; -import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertSelectiveNamespacesBeansPresent; +import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertInformerBeansPresent; /** * Test various conditionals for @@ -70,8 +67,7 @@ void discoveryEnabledDefault() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context, 2); }); } @@ -86,8 +82,8 @@ void discoveryEnabledDefaultWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 3); + // 3 namespaces + assertInformerBeansPresent(context, 3); }); } @@ -102,8 +98,7 @@ void discoveryEnabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context, 2); }); } @@ -118,8 +113,7 @@ void discoveryEnabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 2); + assertInformerBeansPresent(context, 2); }); } @@ -134,8 +128,7 @@ void discoveryDisabled() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context, 2); }); } @@ -150,8 +143,7 @@ void discoveryDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -166,8 +158,7 @@ void kubernetesDiscoveryEnabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context, 2); }); } @@ -183,8 +174,7 @@ void kubernetesDiscoveryEnabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 4); + assertInformerBeansPresent(context, 4); }); } @@ -199,8 +189,7 @@ void kubernetesDiscoveryDisabled() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -216,8 +205,7 @@ void kubernetesDiscoveryDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 4); }); } @@ -232,8 +220,7 @@ void kubernetesDiscoveryBlockingEnabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -248,8 +235,7 @@ void kubernetesDiscoveryBlockingEnabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 1); + assertInformerBeansPresent(context, 2); }); } @@ -264,8 +250,7 @@ void kubernetesDiscoveryBlockingDisabled() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -280,8 +265,7 @@ void kubernetesDiscoveryBlockingDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 2); + assertInformerBeansPresent(context, 2); }); } @@ -296,8 +280,7 @@ void kubernetesDiscoveryHealthIndicatorEnabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -313,8 +296,7 @@ void kubernetesDiscoveryHealthIndicatorEnabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 1); + assertInformerBeansPresent(context, 2); }); } @@ -329,8 +311,7 @@ void kubernetesDiscoveryHealthIndicatorDisabled() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -346,8 +327,7 @@ void kubernetesDiscoveryHealthIndicatorDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 1); + assertInformerBeansPresent(context, 2); }); } @@ -362,8 +342,7 @@ void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissing() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -379,8 +358,7 @@ void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissingWithSelectiv assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 5); + assertInformerBeansPresent(context, 5); }); } @@ -398,8 +376,7 @@ void reactiveDisabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -418,8 +395,7 @@ void reactiveDisabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 5); + assertInformerBeansPresent(context, 5); }); } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index 2172294f51..12d91bc268 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -40,10 +40,7 @@ import org.springframework.context.annotation.Primary; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertNonSelectiveNamespacesBeansMissing; -import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertNonSelectiveNamespacesBeansPresent; -import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertSelectiveNamespacesBeansMissing; -import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertSelectiveNamespacesBeansPresent; +import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertInformerBeansPresent; /** * Test various conditionals for @@ -75,8 +72,7 @@ void discoveryEnabledDefault() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context, 2); }); } @@ -94,8 +90,7 @@ void discoveryEnabledDefaultWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 3); + assertInformerBeansPresent(context, 3); }); } @@ -113,8 +108,7 @@ void discoveryEnabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context, 2); }); } @@ -132,8 +126,7 @@ void discoveryEnabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 3); + assertInformerBeansPresent(context, 3); }); } @@ -148,8 +141,7 @@ void discoveryDisabled() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -164,8 +156,7 @@ void discoveryDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 3); }); } @@ -183,8 +174,7 @@ void kubernetesDiscoveryEnabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -202,8 +192,7 @@ void kubernetesDiscoveryEnabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 2); + assertInformerBeansPresent(context, 2); }); } @@ -219,8 +208,7 @@ void kubernetesDiscoveryDisabled() { // only "simple" one from commons, as ours is not picked up assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -236,8 +224,7 @@ void kubernetesDiscoveryDisabledWithSelectiveNamespaces() { // only "simple" one from commons, as ours is not picked up assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -255,8 +242,7 @@ void kubernetesReactiveDiscoveryEnabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -274,8 +260,7 @@ void kubernetesReactiveDiscoveryEnabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 2); + assertInformerBeansPresent(context, 2); }); } @@ -290,8 +275,7 @@ void kubernetesReactiveDiscoveryDisabled() { assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context, 2); }); } @@ -306,8 +290,7 @@ void kubernetesReactiveDiscoveryDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 2); + assertInformerBeansPresent(context, 2); }); } @@ -328,8 +311,7 @@ void blockingDisabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -350,8 +332,7 @@ void blockingDisabledWithSelectiveNamespaces() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 2); + assertInformerBeansPresent(context, 2); }); } @@ -367,8 +348,7 @@ void healthDisabled() { assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context, 2); }); } @@ -385,8 +365,7 @@ void healthDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 2); + assertInformerBeansPresent(context, 2); }); } @@ -403,8 +382,7 @@ void healthEnabledClassNotPresent() { assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertNonSelectiveNamespacesBeansPresent(context); - assertSelectiveNamespacesBeansMissing(context); + assertInformerBeansPresent(context , 2); }); } @@ -422,8 +400,7 @@ void healthEnabledClassNotPresentWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertNonSelectiveNamespacesBeansMissing(context); - assertSelectiveNamespacesBeansPresent(context, 2); + assertInformerBeansPresent(context, 2); }); } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java index 3dd479c40d..a02d9f56f9 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java @@ -35,41 +35,14 @@ * * @author wind57 */ -public final class TestUtils { +final class TestUtils { private TestUtils() { } - public static void assertSelectiveNamespacesBeansMissing(AssertableApplicationContext context) { - String[] sharedInformerFactoriesBeanName = context - .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>() { - })); - assertThat(sharedInformerFactoriesBeanName).isEmpty(); - - String[] serviceSharedIndexInformersBeanName = context.getBeanNamesForType( - ResolvableType.forType(new ParameterizedTypeReference>>() { - })); - assertThat(serviceSharedIndexInformersBeanName).isEmpty(); - - String[] endpointsSharedIndexInformersBeanName = context.getBeanNamesForType( - ResolvableType.forType(new ParameterizedTypeReference>>() { - })); - assertThat(endpointsSharedIndexInformersBeanName).isEmpty(); - - String[] serviceListersBeanName = context - .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>>() { - })); - assertThat(serviceListersBeanName).isEmpty(); - - String[] endpointsListersBeanName = context - .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>>() { - })); - assertThat(endpointsListersBeanName).isEmpty(); - } - @SuppressWarnings("unchecked") - public static void assertSelectiveNamespacesBeansPresent(AssertableApplicationContext context, int times) { + static void assertInformerBeansPresent(AssertableApplicationContext context, int times) { String sharedInformerFactoriesBeanName = context .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>() { }))[0]; @@ -105,57 +78,4 @@ public static void assertSelectiveNamespacesBeansPresent(AssertableApplicationCo assertThat(endpointsListers.size()).isEqualTo(times); } - @SuppressWarnings("unchecked") - public static void assertNonSelectiveNamespacesBeansPresent(AssertableApplicationContext context) { - assertThat(context).hasSingleBean(SharedInformerFactory.class); - - String serviceSharedIndexInformerBeanName = context.getBeanNamesForType( - ResolvableType.forType(new ParameterizedTypeReference>() { - }))[0]; - SharedIndexInformer serviceSharedIndexInformer = (SharedIndexInformer) context - .getBean(serviceSharedIndexInformerBeanName); - assertThat(serviceSharedIndexInformer).isNotNull(); - - String endpointSharedIndexInformerBeanName = context.getBeanNamesForType( - ResolvableType.forType(new ParameterizedTypeReference>() { - }))[0]; - SharedIndexInformer endpointsSharedIndexInformer = (SharedIndexInformer) context - .getBean(endpointSharedIndexInformerBeanName); - assertThat(endpointsSharedIndexInformer).isNotNull(); - - String serviceListerBeanName = context - .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>() { - }))[0]; - Lister serviceLister = (Lister) context.getBean(serviceListerBeanName); - assertThat(serviceLister).isNotNull(); - - String endpointsListerBeanName = context - .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>() { - }))[0]; - Lister endpointsLister = (Lister) context.getBean(endpointsListerBeanName); - assertThat(endpointsLister).isNotNull(); - } - - public static void assertNonSelectiveNamespacesBeansMissing(AssertableApplicationContext context) { - String[] serviceSharedIndexInformerBeanName = context.getBeanNamesForType( - ResolvableType.forType(new ParameterizedTypeReference>() { - })); - assertThat(serviceSharedIndexInformerBeanName).isEmpty(); - - String[] endpointSharedIndexInformerBeanName = context.getBeanNamesForType( - ResolvableType.forType(new ParameterizedTypeReference>() { - })); - assertThat(endpointSharedIndexInformerBeanName).isEmpty(); - - String[] serviceListerBeanName = context - .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>() { - })); - assertThat(serviceListerBeanName).isEmpty(); - - String[] endpointsListerBeanName = context - .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>() { - })); - assertThat(endpointsListerBeanName).isEmpty(); - } - } From d71abd5a0cff0300cb4d1b6080e2e1beb41bc219 Mon Sep 17 00:00:00 2001 From: wind57 Date: Sun, 12 Oct 2025 21:57:14 +0300 Subject: [PATCH 04/12] wip Signed-off-by: wind57 --- ...overyClientAutoConfigurationApplicationContextTests.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index 12d91bc268..ce53e494a8 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -284,7 +284,7 @@ void kubernetesReactiveDiscoveryDisabledWithSelectiveNamespaces() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", "spring.cloud.discovery.reactive.enabled=false", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { - assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); @@ -324,7 +324,6 @@ void blockingDisabledWithSelectiveNamespaces() { "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("selectiveNamespacesKubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours @@ -394,7 +393,6 @@ void healthEnabledClassNotPresentWithSelectiveNamespaces() { "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("selectiveNamespacesKubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); @@ -411,6 +409,7 @@ private void setup(String... properties) { KubernetesClientAutoConfiguration.class, SimpleReactiveDiscoveryClientAutoConfiguration.class, UtilAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, KubernetesClientInformerAutoConfiguration.class, + KubernetesClientInformerDiscoveryClientAutoConfiguration.class, KubernetesCommonsAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) .withUserConfiguration(ApiClientConfig.class) @@ -424,6 +423,7 @@ private void setupWithFilteredClassLoader(String name, String... properties) { KubernetesClientAutoConfiguration.class, SimpleReactiveDiscoveryClientAutoConfiguration.class, UtilAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, KubernetesCommonsAutoConfiguration.class, KubernetesClientInformerAutoConfiguration.class, + KubernetesClientInformerDiscoveryClientAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) .withUserConfiguration(ApiClientConfig.class) .withClassLoader(new FilteredClassLoader(name)) From 10acbb91d01070852f7e0e22cf139a17318d698a Mon Sep 17 00:00:00 2001 From: wind57 Date: Sun, 12 Oct 2025 23:59:25 +0300 Subject: [PATCH 05/12] wip Signed-off-by: wind57 --- ...rnetesClientInformerAutoConfiguration.java | 4 +- ...ormerDiscoveryClientAutoConfiguration.java | 20 ++++++-- ...ctiveDiscoveryClientAutoConfiguration.java | 9 +++- ...oConfigurationApplicationContextTests.java | 16 +++--- .../client/discovery/TestUtils.java | 27 ++++++++++ ...tesDiscoveryClientHealthConfiguration.java | 49 ------------------- 6 files changed, 63 insertions(+), 62 deletions(-) delete mode 100644 spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesDiscoveryClientHealthConfiguration.java diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java index dc15125921..182accb938 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java @@ -52,6 +52,8 @@ import static org.springframework.cloud.kubernetes.client.KubernetesClientUtils.getApplicationNamespace; /** + * This one uses: 'ConditionalOnBlockingOrReactiveDiscoveryEnabled' because beans it contains + * are specific to both clients. * @author wind57 */ @Configuration(proxyBeanMethods = false) @@ -69,7 +71,7 @@ final class KubernetesClientInformerAutoConfiguration { // we rely on the order of namespaces to enable listers, as such provide a bean of // namespaces as a list, instead of the incoming Set. @Bean - List k8sDiscoveryClientNamespaces(KubernetesDiscoveryProperties properties, + List k8sClientDiscoveryNamespaces(KubernetesDiscoveryProperties properties, KubernetesNamespaceProvider provider) { if (properties.allNamespaces()) { diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java index b8f7affbaa..8e0c471511 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java @@ -26,19 +26,23 @@ import io.kubernetes.client.openapi.models.V1Endpoints; import io.kubernetes.client.openapi.models.V1Service; +import org.apache.commons.logging.LogFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cloud.client.CommonsClientAutoConfiguration; import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration; import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration; +import org.springframework.cloud.kubernetes.commons.PodUtils; import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnSpringCloudKubernetesBlockingDiscovery; -import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryClientHealthConfiguration; +import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnSpringCloudKubernetesBlockingDiscoveryHealthInitializer; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryClientHealthIndicatorInitializer; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; +import org.springframework.core.log.LogAccessor; /** * @author wind57 @@ -48,9 +52,11 @@ @AutoConfigureBefore({ SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class }) @AutoConfigureAfter({ KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class }) -@Import(KubernetesDiscoveryClientHealthConfiguration.class) final class KubernetesClientInformerDiscoveryClientAutoConfiguration { + private static final LogAccessor LOG = new LogAccessor( + LogFactory.getLog(KubernetesClientInformerDiscoveryClientAutoConfiguration.class)); + @Bean @ConditionalOnMissingBean KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( @@ -62,4 +68,12 @@ KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( serviceInformers, endpointsInformers, properties, coreV1Api, predicate); } + @Bean + @ConditionalOnSpringCloudKubernetesBlockingDiscoveryHealthInitializer + KubernetesDiscoveryClientHealthIndicatorInitializer indicatorInitializer( + ApplicationEventPublisher applicationEventPublisher, PodUtils podUtils) { + LOG.debug(() -> "Will publish InstanceRegisteredEvent from blocking implementation"); + return new KubernetesDiscoveryClientHealthIndicatorInitializer(podUtils, applicationEventPublisher); + } + } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java index 3a2eaa55ed..540fdd0364 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java @@ -43,7 +43,6 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.core.log.LogAccessor; @@ -66,7 +65,13 @@ final class KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration { @Bean @ConditionalOnMissingBean KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscoveryClient( - KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { + List sharedInformerFactories, List> serviceListers, + List> endpointsListers, List> serviceInformers, + List> endpointsInformers, KubernetesDiscoveryProperties properties, + CoreV1Api coreV1Api, Predicate predicate) { + KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient = + new KubernetesClientInformerDiscoveryClient(sharedInformerFactories, serviceListers, endpointsListers, + serviceInformers, endpointsInformers, properties, coreV1Api, predicate); return new KubernetesClientInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index ce53e494a8..5b888c57e6 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -40,6 +40,7 @@ import org.springframework.context.annotation.Primary; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertInformerBeansMissing; import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertInformerBeansPresent; /** @@ -224,7 +225,8 @@ void kubernetesDiscoveryDisabledWithSelectiveNamespaces() { // only "simple" one from commons, as ours is not picked up assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context , 2); + // we don't read the KubernetesClientInformerAutoConfiguration + assertInformerBeansMissing(context); }); } @@ -267,15 +269,15 @@ void kubernetesReactiveDiscoveryEnabledWithSelectiveNamespaces() { @Test void kubernetesReactiveDiscoveryDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.reactive.enabled=false"); + "spring.cloud.discovery.reactive.enabled=false", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { - assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); + assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @@ -288,7 +290,7 @@ void kubernetesReactiveDiscoveryDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); + assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertInformerBeansPresent(context, 2); }); @@ -323,7 +325,7 @@ void blockingDisabledWithSelectiveNamespaces() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { - assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java index a02d9f56f9..ac5dcd2d1a 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java @@ -78,4 +78,31 @@ static void assertInformerBeansPresent(AssertableApplicationContext context, int assertThat(endpointsListers.size()).isEqualTo(times); } + static void assertInformerBeansMissing(AssertableApplicationContext context) { + String[] sharedInformerFactoriesBeanName = context + .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>() { + })); + assertThat(sharedInformerFactoriesBeanName).isEmpty(); + + String[] serviceSharedIndexInformersBeanName = context.getBeanNamesForType( + ResolvableType.forType(new ParameterizedTypeReference>>() { + })); + assertThat(serviceSharedIndexInformersBeanName).isEmpty(); + + String[] endpointsSharedIndexInformersBeanName = context.getBeanNamesForType( + ResolvableType.forType(new ParameterizedTypeReference>>() { + })); + assertThat(endpointsSharedIndexInformersBeanName).isEmpty(); + + String[] serviceListersBeanName = context + .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>>() { + })); + assertThat(serviceListersBeanName).isEmpty(); + + String[] endpointsListersBeanName = context + .getBeanNamesForType(ResolvableType.forType(new ParameterizedTypeReference>>() { + })); + assertThat(endpointsListersBeanName).isEmpty(); + } + } diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesDiscoveryClientHealthConfiguration.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesDiscoveryClientHealthConfiguration.java deleted file mode 100644 index 3b7770a580..0000000000 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/KubernetesDiscoveryClientHealthConfiguration.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2019-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.kubernetes.commons.discovery; - -import org.apache.commons.logging.LogFactory; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.health.contributor.HealthIndicator; -import org.springframework.cloud.client.ConditionalOnDiscoveryHealthIndicatorEnabled; -import org.springframework.cloud.kubernetes.commons.PodUtils; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.log.LogAccessor; - -/** - * @author wind57 - */ -@Configuration -public class KubernetesDiscoveryClientHealthConfiguration { - - private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(KubernetesDiscoveryClientHealthConfiguration.class)); - - @Bean - @ConditionalOnClass({ HealthIndicator.class }) - @ConditionalOnDiscoveryHealthIndicatorEnabled - public KubernetesDiscoveryClientHealthIndicatorInitializer indicatorInitializer( - ApplicationEventPublisher applicationEventPublisher, PodUtils podUtils) { - - LOG.debug(() -> "Will publish InstanceRegisteredEvent from blocking implementation"); - return new KubernetesDiscoveryClientHealthIndicatorInitializer(podUtils, applicationEventPublisher); - } - -} From ab29eb2c8440b094820cc0bc2d44f2d4e9325307 Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 00:45:29 +0300 Subject: [PATCH 06/12] wip Signed-off-by: wind57 --- ...ot.autoconfigure.AutoConfiguration.imports | 1 - ...oConfigurationApplicationContextTests.java | 36 ++++-- ...oConfigurationApplicationContextTests.java | 76 +++++------- ...ctiveNamespacesAutoConfigurationTests.java | 113 ------------------ 4 files changed, 52 insertions(+), 174 deletions(-) delete mode 100644 spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests.java diff --git a/spring-cloud-kubernetes-client-discovery/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/spring-cloud-kubernetes-client-discovery/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 9d49cea85f..3527902071 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/spring-cloud-kubernetes-client-discovery/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -2,5 +2,4 @@ org.springframework.cloud.kubernetes.client.discovery.KubernetesClientCatalogWat org.springframework.cloud.kubernetes.client.discovery.KubernetesClientInformerDiscoveryClientAutoConfiguration org.springframework.cloud.kubernetes.client.discovery.KubernetesClientInformerAutoConfiguration org.springframework.cloud.kubernetes.client.discovery.KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration -org.springframework.cloud.kubernetes.client.discovery.KubernetesClientInformerSelectiveNamespacesAutoConfiguration org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientSpelAutoConfiguration diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java index dc29288b12..4637c7eeb3 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -22,6 +22,9 @@ import io.kubernetes.client.util.Config; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; +import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration; +import org.springframework.cloud.commons.util.UtilAutoConfiguration; +import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration; import org.testcontainers.k3s.K3sContainer; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -38,6 +41,7 @@ import org.springframework.context.annotation.Primary; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertInformerBeansMissing; import static org.springframework.cloud.kubernetes.client.discovery.TestUtils.assertInformerBeansPresent; /** @@ -150,15 +154,15 @@ void discoveryDisabledWithSelectiveNamespaces() { @Test void kubernetesDiscoveryEnabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.kubernetes.discovery.enabled=true"); + "spring.cloud.kubernetes.discovery.enabled=true", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @@ -203,9 +207,10 @@ void kubernetesDiscoveryDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + // simpleReactiveDiscoveryClientHealthIndicator + assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context , 4); + assertInformerBeansMissing(context); }); } @@ -401,19 +406,24 @@ void reactiveDisabledWithSelectiveNamespaces() { private void setup(String... properties) { applicationContextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(KubernetesClientInformerDiscoveryClientAutoConfiguration.class, - KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, - KubernetesClientInformerAutoConfiguration.class, - KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) - .withUserConfiguration(ApiClientConfig.class) + .withConfiguration(AutoConfigurations.of( + KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class, + KubernetesClientAutoConfiguration.class, SimpleReactiveDiscoveryClientAutoConfiguration.class, + UtilAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, + KubernetesClientInformerAutoConfiguration.class, + KubernetesClientInformerDiscoveryClientAutoConfiguration.class, + KubernetesCommonsAutoConfiguration.class, + KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) + .withUserConfiguration(KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.ApiClientConfig.class) .withPropertyValues(properties); } private void setupWithFilteredClassLoader(Class cls, String... properties) { applicationContextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(KubernetesClientInformerDiscoveryClientAutoConfiguration.class, + KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class, KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, - KubernetesClientInformerAutoConfiguration.class, + KubernetesClientInformerAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) .withClassLoader(new FilteredClassLoader(cls)) .withUserConfiguration(ApiClientConfig.class) diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index 5b888c57e6..2389a47b29 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -62,18 +62,17 @@ static void afterAll() { @Test void discoveryEnabledDefault() { - setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false"); + setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("kubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @@ -83,13 +82,11 @@ void discoveryEnabledDefaultWithSelectiveNamespaces() { "spring.cloud.kubernetes.discovery.namespaces=a,b,c"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("selectiveNamespacesKubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); assertInformerBeansPresent(context, 3); }); @@ -98,18 +95,16 @@ void discoveryEnabledDefaultWithSelectiveNamespaces() { @Test void discoveryEnabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.enabled=true"); + "spring.cloud.discovery.enabled=true", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("kubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @@ -119,13 +114,11 @@ void discoveryEnabledWithSelectiveNamespaces() { "spring.cloud.discovery.enabled=true", "spring.cloud.kubernetes.discovery.namespaces=a,b,c"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("selectiveNamespacesKubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); assertInformerBeansPresent(context, 3); }); @@ -142,7 +135,7 @@ void discoveryDisabled() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context , 2); + assertInformerBeansMissing(context); }); } @@ -157,25 +150,23 @@ void discoveryDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context , 3); + assertInformerBeansMissing(context); }); } @Test void kubernetesDiscoveryEnabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.kubernetes.discovery.enabled=true"); + "spring.cloud.kubernetes.discovery.enabled=true", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("kubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context , 1); }); } @@ -185,13 +176,11 @@ void kubernetesDiscoveryEnabledWithSelectiveNamespaces() { "spring.cloud.kubernetes.discovery.enabled=true", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("selectiveNamespacesKubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); assertInformerBeansPresent(context, 2); }); @@ -209,7 +198,7 @@ void kubernetesDiscoveryDisabled() { // only "simple" one from commons, as ours is not picked up assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context , 2); + assertInformerBeansMissing(context); }); } @@ -233,18 +222,16 @@ void kubernetesDiscoveryDisabledWithSelectiveNamespaces() { @Test void kubernetesReactiveDiscoveryEnabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.reactive.enabled=true"); + "spring.cloud.discovery.reactive.enabled=true", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("kubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context , 1); }); } @@ -254,13 +241,11 @@ void kubernetesReactiveDiscoveryEnabledWithSelectiveNamespaces() { "spring.cloud.discovery.reactive.enabled=true", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("selectiveNamespacesKubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); assertInformerBeansPresent(context, 2); }); @@ -302,18 +287,16 @@ void kubernetesReactiveDiscoveryDisabledWithSelectiveNamespaces() { @Test void blockingDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=false"); + "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { - assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("kubernetesClientInformerDiscoveryClient"); + assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).hasBean("reactiveIndicatorInitializer"); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context , 1); }); } @@ -340,16 +323,16 @@ void blockingDisabledWithSelectiveNamespaces() { @Test void healthDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.client.health-indicator.enabled=false"); + "spring.cloud.discovery.client.health-indicator.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("kubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @@ -360,7 +343,6 @@ void healthDisabledWithSelectiveNamespaces() { "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("selectiveNamespacesKubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); @@ -374,16 +356,16 @@ void healthDisabledWithSelectiveNamespaces() { void healthEnabledClassNotPresent() { setupWithFilteredClassLoader("org.springframework.boot.health.contributor.ReactiveHealthIndicator", "spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.client.health-indicator.enabled=false"); + "spring.cloud.discovery.client.health-indicator.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).hasBean("kubernetesClientInformerDiscoveryClient"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context , 1); }); } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests.java deleted file mode 100644 index fe4c372b94..0000000000 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright 2019-present 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.List; -import java.util.Set; - -import io.kubernetes.client.openapi.ApiClient; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mockito; - -import org.springframework.boot.autoconfigure.AutoConfigurations; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.boot.test.system.CapturedOutput; -import org.springframework.boot.test.system.OutputCaptureExtension; -import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author wind57 - */ -@ExtendWith(OutputCaptureExtension.class) -class KubernetesClientInformerSelectiveNamespacesAutoConfigurationTests { - - private static final String NAMESPACE_A = "a"; - - private static final String NAMESPACE_B = "b"; - - private static final String NAMESPACE_C = "c"; - - private static final String NAMESPACE_D = "d"; - - @Test - void testBeansCreates(CapturedOutput output) { - - new ApplicationContextRunner() - .withPropertyValues("spring.cloud.discovery.enabled=true", "spring.cloud.kubernetes.discovery.enabled=true", - "spring.cloud.kubernetes.discovery.namespaces[0]=" + NAMESPACE_A, - "spring.cloud.kubernetes.discovery.namespaces[1]=" + NAMESPACE_B, - "spring.main.cloud-platform=kubernetes") - .withConfiguration( - AutoConfigurations.of(KubernetesClientInformerAutoConfiguration.class)) - .withUserConfiguration(Config.class) - .run(context -> { - assertThat(context.getBean("selectiveNamespaces")).isNotNull(); - - @SuppressWarnings("unchecked") - Set selectiveNamespaces = context.getBean("selectiveNamespaces", Set.class); - Assertions.assertThat(selectiveNamespaces).isEqualTo(Set.of("a", "b")); - - @SuppressWarnings("unchecked") - Set namespaces = context.getBean("namespaces", Set.class); - Assertions.assertThat(namespaces).isEqualTo(Set.of("c", "d")); - }); - - assertThat(output.getOut().contains("registering lister (for services) in namespace : " + NAMESPACE_A)) - .isTrue(); - assertThat(output.getOut().contains("registering lister (for services) in namespace : " + NAMESPACE_B)) - .isTrue(); - - assertThat(output.getOut().contains("registering lister (for services) in namespace : " + NAMESPACE_C)) - .isFalse(); - assertThat(output.getOut().contains("registering lister (for services) in namespace : " + NAMESPACE_D)) - .isFalse(); - - assertThat(output.getOut().contains("registering lister (for endpoints) in namespace : " + NAMESPACE_A)) - .isTrue(); - assertThat(output.getOut().contains("registering lister (for endpoints) in namespace : " + NAMESPACE_B)) - .isTrue(); - - assertThat(output.getOut().contains("registering lister (for endpoints) in namespace : " + NAMESPACE_C)) - .isFalse(); - assertThat(output.getOut().contains("registering lister (for endpoints) in namespace : " + NAMESPACE_D)) - .isFalse(); - } - - @Configuration - @EnableConfigurationProperties(KubernetesDiscoveryProperties.class) - static class Config { - - @Bean - ApiClient apiClient() { - return Mockito.mock(ApiClient.class); - } - - @Bean - List namespaces() { - return List.of(NAMESPACE_C, NAMESPACE_D); - } - - } - -} From 6668367728dd98c98b9fd5b1b27158877c5ec45d Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 11:46:19 +0300 Subject: [PATCH 07/12] fix Signed-off-by: wind57 --- ...rnetesClientInformerAutoConfiguration.java | 27 ++- ...ormerDiscoveryClientAutoConfiguration.java | 6 +- ...ctiveDiscoveryClientAutoConfiguration.java | 12 +- ...oConfigurationApplicationContextTests.java | 227 +++++++++++------- ...oConfigurationApplicationContextTests.java | 10 +- .../client/discovery/TestUtils.java | 8 +- 6 files changed, 178 insertions(+), 112 deletions(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java index f1f2f2b0ef..8ea470fa0c 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerAutoConfiguration.java @@ -52,8 +52,9 @@ import static org.springframework.cloud.kubernetes.client.KubernetesClientUtils.getApplicationNamespace; /** - * This one uses: 'ConditionalOnBlockingOrReactiveDiscoveryEnabled' because beans it contains - * are specific to both clients. + * This one uses: 'ConditionalOnBlockingOrReactiveDiscoveryEnabled' because beans it + * contains are specific to both clients. + * * @author wind57 */ @Configuration(proxyBeanMethods = false) @@ -66,7 +67,7 @@ final class KubernetesClientInformerAutoConfiguration { private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(KubernetesClientInformerAutoConfiguration.class)); + LogFactory.getLog(KubernetesClientInformerAutoConfiguration.class)); // we rely on the order of namespaces to enable listers, as such provide a bean of // namespaces as a list, instead of the incoming Set. @@ -104,16 +105,16 @@ List sharedInformerFactories(ApiClient apiClient, List> serviceSharedIndexInformers( - List sharedInformerFactories, List selectiveNamespaces, - ApiClient apiClient) { + List sharedInformerFactories, List selectiveNamespaces, + ApiClient apiClient) { int howManyNamespaces = selectiveNamespaces.size(); List> serviceSharedIndexedInformers = new ArrayList<>(howManyNamespaces); for (int i = 0; i < howManyNamespaces; ++i) { GenericKubernetesApi servicesApi = new GenericKubernetesApi<>(V1Service.class, - V1ServiceList.class, "", "v1", "services", apiClient); + V1ServiceList.class, "", "v1", "services", apiClient); SharedIndexInformer sharedIndexInformer = sharedInformerFactories.get(i) .sharedIndexInformerFor(servicesApi, V1Service.class, 0L, selectiveNamespaces.get(i)); serviceSharedIndexedInformers.add(sharedIndexInformer); @@ -124,7 +125,7 @@ List> serviceSharedIndexInformers( @Bean @ConditionalOnMissingBean(value = V1Service.class, parameterizedContainer = { List.class, Lister.class }) List> serviceListers(List selectiveNamespaces, - List> serviceSharedIndexInformers) { + List> serviceSharedIndexInformers) { int howManyNamespaces = selectiveNamespaces.size(); List> serviceListers = new ArrayList<>(howManyNamespaces); @@ -141,16 +142,16 @@ List> serviceListers(List selectiveNamespaces, @Bean @ConditionalOnMissingBean(value = V1Endpoints.class, - parameterizedContainer = { List.class, SharedIndexInformer.class }) + parameterizedContainer = { List.class, SharedIndexInformer.class }) List> endpointsSharedIndexInformers( - List sharedInformerFactories, List selectiveNamespaces, - ApiClient apiClient) { + List sharedInformerFactories, List selectiveNamespaces, + ApiClient apiClient) { int howManyNamespaces = selectiveNamespaces.size(); List> endpointsSharedIndexedInformers = new ArrayList<>(howManyNamespaces); for (int i = 0; i < howManyNamespaces; ++i) { GenericKubernetesApi endpointsApi = new GenericKubernetesApi<>( - V1Endpoints.class, V1EndpointsList.class, "", "v1", "endpoints", apiClient); + V1Endpoints.class, V1EndpointsList.class, "", "v1", "endpoints", apiClient); SharedIndexInformer sharedIndexInformer = sharedInformerFactories.get(i) .sharedIndexInformerFor(endpointsApi, V1Endpoints.class, 0L, selectiveNamespaces.get(i)); endpointsSharedIndexedInformers.add(sharedIndexInformer); @@ -161,7 +162,7 @@ List> endpointsSharedIndexInformers( @Bean @ConditionalOnMissingBean(value = V1Endpoints.class, parameterizedContainer = { List.class, Lister.class }) List> endpointsListers(List selectiveNamespaces, - List> serviceSharedIndexInformers) { + List> serviceSharedIndexInformers) { int howManyNamespaces = selectiveNamespaces.size(); List> endpointsListers = new ArrayList<>(howManyNamespaces); diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java index 6937a4ac7b..4dda10ced4 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java @@ -25,8 +25,8 @@ import io.kubernetes.client.openapi.apis.CoreV1Api; import io.kubernetes.client.openapi.models.V1Endpoints; import io.kubernetes.client.openapi.models.V1Service; - import org.apache.commons.logging.LogFactory; + import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -55,7 +55,7 @@ final class KubernetesClientInformerDiscoveryClientAutoConfiguration { private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(KubernetesClientInformerDiscoveryClientAutoConfiguration.class)); + LogFactory.getLog(KubernetesClientInformerDiscoveryClientAutoConfiguration.class)); @Bean @ConditionalOnMissingBean @@ -71,7 +71,7 @@ KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( @Bean @ConditionalOnSpringCloudKubernetesBlockingDiscoveryHealthInitializer KubernetesDiscoveryClientHealthIndicatorInitializer indicatorInitializer( - ApplicationEventPublisher applicationEventPublisher, PodUtils podUtils) { + ApplicationEventPublisher applicationEventPublisher, PodUtils podUtils) { LOG.debug(() -> "Will publish InstanceRegisteredEvent from blocking implementation"); return new KubernetesDiscoveryClientHealthIndicatorInitializer(podUtils, applicationEventPublisher); } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java index 14f64bfaef..ba82314f9a 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java @@ -69,9 +69,9 @@ KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscover List> endpointsListers, List> serviceInformers, List> endpointsInformers, KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { - KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient = - new KubernetesClientInformerDiscoveryClient(sharedInformerFactories, serviceListers, endpointsListers, - serviceInformers, endpointsInformers, properties, coreV1Api, predicate); + KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient = new KubernetesClientInformerDiscoveryClient( + sharedInformerFactories, serviceListers, endpointsListers, serviceInformers, endpointsInformers, + properties, coreV1Api, predicate); return new KubernetesClientInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); } @@ -81,7 +81,7 @@ KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscover @Bean @ConditionalOnSpringCloudKubernetesReactiveDiscoveryHealthInitializer KubernetesDiscoveryClientHealthIndicatorInitializer reactiveIndicatorInitializer( - ApplicationEventPublisher applicationEventPublisher, PodUtils podUtils) { + ApplicationEventPublisher applicationEventPublisher, PodUtils podUtils) { LOG.debug(() -> "Will publish InstanceRegisteredEvent from reactive implementation"); return new KubernetesDiscoveryClientHealthIndicatorInitializer(podUtils, applicationEventPublisher); } @@ -92,8 +92,8 @@ KubernetesDiscoveryClientHealthIndicatorInitializer reactiveIndicatorInitializer @Bean @ConditionalOnSpringCloudKubernetesReactiveDiscoveryHealthInitializer ReactiveDiscoveryClientHealthIndicator kubernetesReactiveDiscoveryClientHealthIndicator( - KubernetesClientInformerReactiveDiscoveryClient client, - DiscoveryClientHealthIndicatorProperties properties) { + KubernetesClientInformerReactiveDiscoveryClient client, + DiscoveryClientHealthIndicatorProperties properties) { return new ReactiveDiscoveryClientHealthIndicator(client, properties); } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java index 4637c7eeb3..d51d1ad4a1 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -22,9 +22,6 @@ import io.kubernetes.client.util.Config; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Test; -import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration; -import org.springframework.cloud.commons.util.UtilAutoConfiguration; -import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration; import org.testcontainers.k3s.K3sContainer; import org.springframework.boot.autoconfigure.AutoConfigurations; @@ -32,7 +29,10 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscoveryClientHealthIndicator; +import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration; +import org.springframework.cloud.commons.util.UtilAutoConfiguration; import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration; +import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryClientHealthIndicatorInitializer; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; import org.springframework.cloud.kubernetes.integration.tests.commons.Commons; @@ -63,15 +63,20 @@ static void afterAll() { @Test void discoveryEnabledDefault() { - setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false"); + setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @@ -81,10 +86,14 @@ void discoveryEnabledDefaultWithSelectiveNamespaces() { "spring.cloud.kubernetes.discovery.namespaces=a,b,c"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); // 3 namespaces assertInformerBeansPresent(context, 3); @@ -94,15 +103,19 @@ void discoveryEnabledDefaultWithSelectiveNamespaces() { @Test void discoveryEnabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.enabled=true"); + "spring.cloud.discovery.enabled=true", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @@ -112,12 +125,16 @@ void discoveryEnabledWithSelectiveNamespaces() { "spring.cloud.discovery.enabled=true", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); - - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertInformerBeansPresent(context, 2); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + // reactive only present + assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); }); } @@ -132,7 +149,7 @@ void discoveryDisabled() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context, 2); + assertInformerBeansMissing(context); }); } @@ -147,7 +164,7 @@ void discoveryDisabledWithSelectiveNamespaces() { assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context , 2); + assertInformerBeansMissing(context); }); } @@ -173,10 +190,14 @@ void kubernetesDiscoveryEnabledWithSelectiveNamespaces() { "spring.cloud.kubernetes.discovery.namespaces=a,b,c,d"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); assertInformerBeansPresent(context, 4); }); @@ -191,9 +212,11 @@ void kubernetesDiscoveryDisabled() { assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class); + // not ours, but form commons + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context , 2); + assertInformerBeansMissing(context); }); } @@ -217,15 +240,19 @@ void kubernetesDiscoveryDisabledWithSelectiveNamespaces() { @Test void kubernetesDiscoveryBlockingEnabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=true"); + "spring.cloud.discovery.blocking.enabled=true", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context, 1); }); } @@ -235,27 +262,35 @@ void kubernetesDiscoveryBlockingEnabledWithSelectiveNamespaces() { "spring.cloud.discovery.blocking.enabled=true", "spring.cloud.kubernetes.discovery.namespaces=a"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @Test void kubernetesDiscoveryBlockingDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.blocking.enabled=false"); + "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context, 1); }); } @@ -265,10 +300,14 @@ void kubernetesDiscoveryBlockingDisabledWithSelectiveNamespaces() { "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); assertInformerBeansPresent(context, 2); }); @@ -277,15 +316,20 @@ void kubernetesDiscoveryBlockingDisabledWithSelectiveNamespaces() { @Test void kubernetesDiscoveryHealthIndicatorEnabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.client.health-indicator.enabled=true"); + "spring.cloud.discovery.client.health-indicator.enabled=true", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context, 1); }); } @@ -296,27 +340,32 @@ void kubernetesDiscoveryHealthIndicatorEnabledWithSelectiveNamespaces() { "spring.cloud.kubernetes.discovery.namespaces=b"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @Test void kubernetesDiscoveryHealthIndicatorDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.client.health-indicator.enabled=false"); + "spring.cloud.discovery.client.health-indicator.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context, 1); }); } @@ -327,27 +376,34 @@ void kubernetesDiscoveryHealthIndicatorDisabledWithSelectiveNamespaces() { "spring.cloud.kubernetes.discovery.namespaces=b"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context, 2); + assertInformerBeansPresent(context, 1); }); } @Test void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissing() { setupWithFilteredClassLoader(HealthIndicator.class, "spring.main.cloud-platform=KUBERNETES", - "spring.cloud.config.enabled=false", "spring.cloud.discovery.client.health-indicator.enabled=true"); + "spring.cloud.config.enabled=false", "spring.cloud.discovery.client.health-indicator.enabled=true", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); + // reactive only present + assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context, 1); }); } @@ -358,10 +414,15 @@ void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissingWithSelectiv "spring.cloud.kubernetes.discovery.namespaces=a,b,c,d,e"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); - assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); + assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); + assertThat(context).hasBean("reactiveIndicatorInitializer"); + assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); + // ours + assertThat(context).hasBean("kubernetesReactiveDiscoveryClientHealthIndicator"); + // from commons, not ours + assertThat(context).hasBean("simpleReactiveDiscoveryClientHealthIndicator"); assertInformerBeansPresent(context, 5); }); @@ -373,7 +434,7 @@ void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissingWithSelectiv @Test void reactiveDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.discovery.reactive.enabled=false"); + "spring.cloud.discovery.reactive.enabled=false", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); @@ -381,7 +442,7 @@ void reactiveDisabled() { assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); - assertInformerBeansPresent(context , 2); + assertInformerBeansPresent(context, 1); }); } @@ -407,26 +468,30 @@ void reactiveDisabledWithSelectiveNamespaces() { private void setup(String... properties) { applicationContextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of( - KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class, - KubernetesClientAutoConfiguration.class, SimpleReactiveDiscoveryClientAutoConfiguration.class, - UtilAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, - KubernetesClientInformerAutoConfiguration.class, - KubernetesClientInformerDiscoveryClientAutoConfiguration.class, - KubernetesCommonsAutoConfiguration.class, - KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) - .withUserConfiguration(KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.ApiClientConfig.class) + KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class, + KubernetesClientAutoConfiguration.class, SimpleReactiveDiscoveryClientAutoConfiguration.class, + UtilAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, + KubernetesClientInformerAutoConfiguration.class, + KubernetesClientInformerDiscoveryClientAutoConfiguration.class, + KubernetesCommonsAutoConfiguration.class, + KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) + .withUserConfiguration( + KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.ApiClientConfig.class) .withPropertyValues(properties); } private void setupWithFilteredClassLoader(Class cls, String... properties) { applicationContextRunner = new ApplicationContextRunner() - .withConfiguration(AutoConfigurations.of(KubernetesClientInformerDiscoveryClientAutoConfiguration.class, + .withConfiguration(AutoConfigurations.of( KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class, - KubernetesClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, - KubernetesClientInformerAutoConfiguration.class, + KubernetesClientAutoConfiguration.class, SimpleReactiveDiscoveryClientAutoConfiguration.class, + UtilAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class, + KubernetesCommonsAutoConfiguration.class, KubernetesClientInformerAutoConfiguration.class, + KubernetesClientInformerDiscoveryClientAutoConfiguration.class, KubernetesClientDiscoveryClientSpelAutoConfiguration.class)) + .withUserConfiguration( + KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.ApiClientConfig.class) .withClassLoader(new FilteredClassLoader(cls)) - .withUserConfiguration(ApiClientConfig.class) .withPropertyValues(properties); } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index 2389a47b29..4f28460dc7 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -63,7 +63,7 @@ static void afterAll() { @Test void discoveryEnabledDefault() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.kubernetes.client.namespace=default"); + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); @@ -166,7 +166,7 @@ void kubernetesDiscoveryEnabled() { assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); - assertInformerBeansPresent(context , 1); + assertInformerBeansPresent(context, 1); }); } @@ -231,7 +231,7 @@ void kubernetesReactiveDiscoveryEnabled() { assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); assertThat(context).getBeans(KubernetesDiscoveryClientHealthIndicatorInitializer.class).hasSize(2); - assertInformerBeansPresent(context , 1); + assertInformerBeansPresent(context, 1); }); } @@ -296,7 +296,7 @@ void blockingDisabled() { assertThat(context).getBeans(ReactiveDiscoveryClientHealthIndicator.class).hasSize(2); assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertInformerBeansPresent(context , 1); + assertInformerBeansPresent(context, 1); }); } @@ -365,7 +365,7 @@ void healthEnabledClassNotPresent() { assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class); assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); - assertInformerBeansPresent(context , 1); + assertInformerBeansPresent(context, 1); }); } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java index ac5dcd2d1a..4bde1419f3 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/TestUtils.java @@ -85,13 +85,13 @@ static void assertInformerBeansMissing(AssertableApplicationContext context) { assertThat(sharedInformerFactoriesBeanName).isEmpty(); String[] serviceSharedIndexInformersBeanName = context.getBeanNamesForType( - ResolvableType.forType(new ParameterizedTypeReference>>() { - })); + ResolvableType.forType(new ParameterizedTypeReference>>() { + })); assertThat(serviceSharedIndexInformersBeanName).isEmpty(); String[] endpointsSharedIndexInformersBeanName = context.getBeanNamesForType( - ResolvableType.forType(new ParameterizedTypeReference>>() { - })); + ResolvableType.forType(new ParameterizedTypeReference>>() { + })); assertThat(endpointsSharedIndexInformersBeanName).isEmpty(); String[] serviceListersBeanName = context From 10a280278343f0492cc168574269b38919eb2698 Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 12:09:09 +0300 Subject: [PATCH 08/12] test Signed-off-by: wind57 From 54d078562138dcea41d5d3de48f035a0d55cb1fe Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 13:07:19 +0300 Subject: [PATCH 09/12] fix test Signed-off-by: wind57 --- .../k8s/client/discovery/KubernetesClientDiscoverySimpleIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientDiscoverySimpleIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientDiscoverySimpleIT.java index d9eca5114f..d1d91de59a 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientDiscoverySimpleIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientDiscoverySimpleIT.java @@ -89,7 +89,7 @@ void test(CapturedOutput output) throws Exception { K3S.execInContainer("sh", "-c", "kubectl annotate pods " + both[1].split("/")[1] + " custom-annotation=custom-annotation-value"); - assertLogStatement(output, "using selective namespaces : [default]"); + assertLogStatement(output, "serviceSharedInformers will use selective namespaces : [default]"); List services = discoveryClient.getServices(); List instances = discoveryClient.getInstances("busybox-service"); From b6d73cfcda0c89c66381489aac31a84f6ffca95c Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 15:16:32 +0300 Subject: [PATCH 10/12] fix test Signed-off-by: wind57 --- ...rReactiveDiscoveryClientAutoConfiguration.java | 15 +++++++++++---- ...tAutoConfigurationApplicationContextTests.java | 8 ++++++-- ...tAutoConfigurationApplicationContextTests.java | 8 ++++++-- .../discovery/KubernetesClientReactiveIT.java | 6 ++++++ 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java index ba82314f9a..70666fca0f 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java @@ -62,16 +62,23 @@ final class KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration { private static final LogAccessor LOG = new LogAccessor( LogFactory.getLog(KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.class)); + // in case blocking is disabled @Bean @ConditionalOnMissingBean - KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscoveryClient( + KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClientForReactiveImplementation( List sharedInformerFactories, List> serviceListers, List> endpointsListers, List> serviceInformers, List> endpointsInformers, KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { - KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient = new KubernetesClientInformerDiscoveryClient( - sharedInformerFactories, serviceListers, endpointsListers, serviceInformers, endpointsInformers, - properties, coreV1Api, predicate); + + return new KubernetesClientInformerDiscoveryClient(sharedInformerFactories, serviceListers, endpointsListers, + serviceInformers, endpointsInformers, properties, coreV1Api, predicate); + } + + @Bean + @ConditionalOnMissingBean + KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscoveryClient( + KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { return new KubernetesClientInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java index d51d1ad4a1..2608fc71e2 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -280,7 +280,9 @@ void kubernetesDiscoveryBlockingDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { - assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); + // only the implementation for the reactive + assertThat(context).hasBean("kubernetesClientInformerDiscoveryClientForReactiveImplementation"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); @@ -299,7 +301,9 @@ void kubernetesDiscoveryBlockingDisabledWithSelectiveNamespaces() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { - assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); + // only the implementation for the reactive + assertThat(context).hasBean("kubernetesClientInformerDiscoveryClientForReactiveImplementation"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class); diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index 4f28460dc7..b416b6db0b 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -289,7 +289,9 @@ void blockingDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { - assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); + // only the implementation for the reactive + assertThat(context).hasBean("kubernetesClientInformerDiscoveryClientForReactiveImplementation"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours @@ -308,7 +310,9 @@ void blockingDisabledWithSelectiveNamespaces() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", "spring.cloud.discovery.blocking.enabled=false", "spring.cloud.kubernetes.discovery.namespaces=a,b"); applicationContextRunner.run(context -> { - assertThat(context).doesNotHaveBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); + // only the implementation for the reactive + assertThat(context).hasBean("kubernetesClientInformerDiscoveryClientForReactiveImplementation"); assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); // simple from commons and ours diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java index e05eb79f55..e16b441279 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java @@ -29,6 +29,7 @@ import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.web.server.test.LocalManagementPort; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; +import org.springframework.cloud.client.discovery.composite.reactive.ReactiveCompositeDiscoveryClient; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.integration.tests.commons.Images; import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; @@ -79,6 +80,11 @@ void afterEach() { */ @Test void test(CapturedOutput output) { + + ReactiveCompositeDiscoveryClient compositeDiscoveryClient = (ReactiveCompositeDiscoveryClient) discoveryClient; + + compositeDiscoveryClient.getDiscoveryClients().get(0).getServices().blockFirst(); + assertReactiveConfiguration(output, port); assertPodMetadata(discoveryClient); } From 6b5b8df9133662514637cd29cdb222ba477b363a Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 17:34:13 +0300 Subject: [PATCH 11/12] fix Signed-off-by: wind57 --- .../k8s/client/discovery/KubernetesClientReactiveIT.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java index e16b441279..e05eb79f55 100644 --- a/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java +++ b/spring-cloud-kubernetes-integration-tests/spring-cloud-kubernetes-k8s-client-discovery/src/test/java/org/springframework/cloud/kubernetes/k8s/client/discovery/KubernetesClientReactiveIT.java @@ -29,7 +29,6 @@ import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.web.server.test.LocalManagementPort; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; -import org.springframework.cloud.client.discovery.composite.reactive.ReactiveCompositeDiscoveryClient; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.integration.tests.commons.Images; import org.springframework.cloud.kubernetes.integration.tests.commons.Phase; @@ -80,11 +79,6 @@ void afterEach() { */ @Test void test(CapturedOutput output) { - - ReactiveCompositeDiscoveryClient compositeDiscoveryClient = (ReactiveCompositeDiscoveryClient) discoveryClient; - - compositeDiscoveryClient.getDiscoveryClients().get(0).getServices().blockFirst(); - assertReactiveConfiguration(output, port); assertPodMetadata(discoveryClient); } From 77d4e399ffcc4b62178a113ae10fc31ecdb9619d Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 17:53:42 +0300 Subject: [PATCH 12/12] test Signed-off-by: wind57