Fix 1207 issue fabric8 (#1209)

This commit is contained in:
erabii
2023-02-04 16:26:54 +02:00
committed by GitHub
parent 450616d3fa
commit 9bf8d120c4
22 changed files with 581 additions and 58 deletions

View File

@@ -41,6 +41,7 @@ import org.springframework.cloud.kubernetes.commons.PodUtils;
import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnKubernetesDiscoveryEnabled;
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;

View File

@@ -25,10 +25,10 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.cloud.CloudPlatform;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration;
import org.springframework.cloud.kubernetes.client.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider;
import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnKubernetesCatalogEnabled;
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.Configuration;
import org.springframework.core.env.Environment;

View File

@@ -40,11 +40,11 @@ import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscov
import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration;
import org.springframework.cloud.kubernetes.client.KubernetesClientPodUtils;
import org.springframework.cloud.kubernetes.client.discovery.CatalogSharedInformerFactory;
import org.springframework.cloud.kubernetes.client.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.client.discovery.SpringCloudKubernetesInformerFactoryProcessor;
import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider;
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.Configuration;
import org.springframework.core.env.Environment;

View File

@@ -1,4 +1,3 @@
org.springframework.cloud.kubernetes.client.discovery.catalog.KubernetesCatalogWatchAutoConfiguration
org.springframework.cloud.kubernetes.client.discovery.KubernetesInformerDiscoveryClientAutoConfiguration
org.springframework.cloud.kubernetes.client.discovery.KubernetesDiscoveryPropertiesAutoConfiguration
org.springframework.cloud.kubernetes.client.discovery.reactive.KubernetesInformerReactiveDiscoveryClientAutoConfiguration

View File

@@ -30,6 +30,7 @@ import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration;
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;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

View File

@@ -21,9 +21,9 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration;
import org.springframework.cloud.kubernetes.client.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.client.discovery.KubernetesInformerDiscoveryClient;
import org.springframework.cloud.kubernetes.client.discovery.reactive.KubernetesInformerReactiveDiscoveryClient;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import static org.assertj.core.api.Assertions.assertThat;
@@ -87,8 +87,8 @@ class KubernetesCatalogWatchAutoConfigurationApplicationContextTests {
}
/**
* both blocking and reactive configs are disabled, should not influence catalog
* watcher in any way.
* spring.cloud.kubernetes.discovery.enabled is false, but does not influence catalog
* watcher.
*/
@Test
void disableKubernetesDiscovery() {

View File

@@ -26,8 +26,8 @@ import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactive
import org.springframework.cloud.commons.util.UtilAutoConfiguration;
import org.springframework.cloud.kubernetes.client.KubernetesClientAutoConfiguration;
import org.springframework.cloud.kubernetes.client.discovery.CatalogSharedInformerFactory;
import org.springframework.cloud.kubernetes.client.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.client.discovery.SpringCloudKubernetesInformerFactoryProcessor;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import static org.assertj.core.api.Assertions.assertThat;

View File

@@ -14,10 +14,9 @@
* limitations under the License.
*/
package org.springframework.cloud.kubernetes.client.discovery;
package org.springframework.cloud.kubernetes.commons.discovery;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
/**
* @author wind57

View File

@@ -1,3 +1,4 @@
org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration
org.springframework.cloud.kubernetes.commons.config.reload.ConfigReloadAutoConfiguration
org.springframework.cloud.kubernetes.commons.config.reload.ConfigReloadPropertiesAutoConfiguration
org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration

View File

@@ -110,6 +110,11 @@
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -26,6 +26,7 @@ import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider;
import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnKubernetesCatalogEnabled;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -40,7 +41,7 @@ import org.springframework.core.env.Environment;
@ConditionalOnDiscoveryEnabled
@ConditionalOnKubernetesCatalogEnabled
@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
@AutoConfigureAfter({ Fabric8AutoConfiguration.class })
@AutoConfigureAfter({ Fabric8AutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class })
public class KubernetesCatalogWatchAutoConfiguration {
@Bean

View File

@@ -0,0 +1,47 @@
/*
* Copyright 2013-2023 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.fabric8.discovery;
import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
import org.springframework.cloud.kubernetes.fabric8.Fabric8Utils;
import org.springframework.core.env.Environment;
/**
* @author wind57
*/
public final class KubernetesClientServicesFunctionProvider {
private KubernetesClientServicesFunctionProvider() {
}
public static KubernetesClientServicesFunction servicesFunction(KubernetesDiscoveryProperties properties,
Environment environment) {
if (properties.allNamespaces()) {
return (client) -> client.services().inAnyNamespace().withLabels(properties.serviceLabels());
}
return client -> {
String namespace = Fabric8Utils.getApplicationNamespace(client, null, "discovery-service",
new KubernetesNamespaceProvider(environment));
return client.services().inNamespace(namespace).withLabels(properties.serviceLabels());
};
}
}

View File

@@ -25,19 +25,17 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.cloud.CloudPlatform;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.CommonsClientAutoConfiguration;
import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.client.ConditionalOnDiscoveryHealthIndicatorEnabled;
import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration;
import org.springframework.cloud.kubernetes.commons.KubernetesNamespaceProvider;
import org.springframework.cloud.kubernetes.commons.PodUtils;
import org.springframework.cloud.kubernetes.commons.discovery.ConditionalOnKubernetesDiscoveryEnabled;
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.cloud.kubernetes.fabric8.Fabric8AutoConfiguration;
import org.springframework.cloud.kubernetes.fabric8.Fabric8Utils;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -51,55 +49,35 @@ import org.springframework.core.env.Environment;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnKubernetesDiscoveryEnabled
@ConditionalOnBlockingDiscoveryEnabled
@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
@AutoConfigureBefore({ SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class })
@AutoConfigureAfter({ Fabric8AutoConfiguration.class })
@EnableConfigurationProperties(KubernetesDiscoveryProperties.class)
@AutoConfigureAfter({ Fabric8AutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class })
public class KubernetesDiscoveryClientAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public KubernetesClientServicesFunction servicesFunction(KubernetesDiscoveryProperties properties,
Environment environment) {
if (properties.allNamespaces()) {
return (client) -> client.services().inAnyNamespace().withLabels(properties.serviceLabels());
}
return client -> {
String namespace = Fabric8Utils.getApplicationNamespace(client, null, "discovery-service",
new KubernetesNamespaceProvider(environment));
return client.services().inNamespace(namespace).withLabels(properties.serviceLabels());
};
return KubernetesClientServicesFunctionProvider.servicesFunction(properties, environment);
}
@Bean
@ConditionalOnMissingBean
public KubernetesDiscoveryClient kubernetesDiscoveryClient(KubernetesClient client,
KubernetesDiscoveryProperties properties,
KubernetesClientServicesFunction kubernetesClientServicesFunction) {
return new KubernetesDiscoveryClient(client, properties, kubernetesClientServicesFunction, null,
new ServicePortSecureResolver(properties));
}
@Bean
@ConditionalOnClass({ HealthIndicator.class })
@ConditionalOnDiscoveryEnabled
@ConditionalOnDiscoveryHealthIndicatorEnabled
@Configuration
public static class KubernetesDiscoveryClientHealthIndicatorConfiguration {
@Bean
public KubernetesDiscoveryClientHealthIndicatorInitializer indicatorInitializer(
ApplicationEventPublisher applicationEventPublisher, PodUtils<?> podUtils) {
return new KubernetesDiscoveryClientHealthIndicatorInitializer(podUtils, applicationEventPublisher);
}
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnBlockingDiscoveryEnabled
@ConditionalOnKubernetesDiscoveryEnabled
public static class KubernetesDiscoveryClientConfiguration {
@Bean
@ConditionalOnMissingBean
public KubernetesDiscoveryClient kubernetesDiscoveryClient(KubernetesClient client,
KubernetesDiscoveryProperties properties,
KubernetesClientServicesFunction kubernetesClientServicesFunction) {
return new KubernetesDiscoveryClient(client, properties, kubernetesClientServicesFunction, null,
new ServicePortSecureResolver(properties));
}
public KubernetesDiscoveryClientHealthIndicatorInitializer indicatorInitializer(
ApplicationEventPublisher applicationEventPublisher, PodUtils<?> podUtils) {
return new KubernetesDiscoveryClientHealthIndicatorInitializer(podUtils, applicationEventPublisher);
}
}

View File

@@ -34,10 +34,13 @@ import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscov
import org.springframework.cloud.client.discovery.simple.reactive.SimpleReactiveDiscoveryClientAutoConfiguration;
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.cloud.kubernetes.fabric8.discovery.KubernetesClientServicesFunction;
import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesClientServicesFunctionProvider;
import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
/**
* Auto configuration for reactive discovery client.
@@ -46,15 +49,22 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnKubernetesDiscoveryEnabled
@ConditionalOnReactiveDiscoveryEnabled
@ConditionalOnCloudPlatform(CloudPlatform.KUBERNETES)
@ConditionalOnKubernetesDiscoveryEnabled
@AutoConfigureBefore({ SimpleReactiveDiscoveryClientAutoConfiguration.class,
ReactiveCommonsClientAutoConfiguration.class })
@AutoConfigureAfter({ ReactiveCompositeDiscoveryClientAutoConfiguration.class,
KubernetesDiscoveryClientAutoConfiguration.class })
KubernetesDiscoveryClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class })
public class KubernetesReactiveDiscoveryClientAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public KubernetesClientServicesFunction servicesFunction(KubernetesDiscoveryProperties properties,
Environment environment) {
return KubernetesClientServicesFunctionProvider.servicesFunction(properties, environment);
}
@Bean
@ConditionalOnMissingBean
public KubernetesReactiveDiscoveryClient kubernetesReactiveDiscoveryClient(KubernetesClient client,

View File

@@ -29,6 +29,7 @@ import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.kubernetes.commons.PodUtils;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -81,8 +82,8 @@ public class KubernetesCatalogServicesWatchConfigurationTest {
envList.add("spring.cloud.config.enabled=false");
this.context = new SpringApplicationBuilder(PropertyPlaceholderAutoConfiguration.class,
KubernetesClientTestConfiguration.class, KubernetesCatalogWatchAutoConfiguration.class,
KubernetesDiscoveryClientAutoConfiguration.class).web(WebApplicationType.NONE)
.properties(envList.toArray(new String[0])).run();
KubernetesDiscoveryClientAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class)
.web(WebApplicationType.NONE).properties(envList.toArray(new String[0])).run();
}
@Configuration(proxyBeanMethods = false)

View File

@@ -0,0 +1,111 @@
/*
* Copyright 2013-2023 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.fabric8.discovery;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration;
import org.springframework.cloud.kubernetes.fabric8.discovery.reactive.KubernetesReactiveDiscoveryClient;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author wind57
*/
class KubernetesCatalogWatchAutoConfigurationApplicationContextTests {
private ApplicationContextRunner applicationContextRunner;
@Test
void discoveryEnabledDefault() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false");
applicationContextRunner.run(context -> assertThat(context).hasSingleBean(KubernetesCatalogWatch.class));
}
@Test
void discoveryEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=true");
applicationContextRunner.run(context -> assertThat(context).hasSingleBean(KubernetesCatalogWatch.class));
}
@Test
void discoveryDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=false");
applicationContextRunner.run(context -> assertThat(context).doesNotHaveBean(KubernetesCatalogWatch.class));
}
@Test
void kubernetesDiscoveryEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.enabled=true");
applicationContextRunner.run(context -> assertThat(context).hasSingleBean(KubernetesCatalogWatch.class));
}
// disabling discovery has no impact on the catalog watch.
@Test
void kubernetesDiscoveryDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.enabled=false");
applicationContextRunner.run(context -> assertThat(context).hasSingleBean(KubernetesCatalogWatch.class));
}
/**
* both blocking and reactive configs are disabled, should not influence catalog
* watcher in any way.
*/
@Test
void disableBlockingAndReactive() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=false", "spring.cloud.discovery.reactive.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesCatalogWatch.class);
assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClient.class);
assertThat(context).doesNotHaveBean(KubernetesReactiveDiscoveryClient.class);
});
}
/**
* spring.cloud.kubernetes.discovery.enabled is false, but does not influence catalog
* watcher.
*/
@Test
void disableKubernetesDiscovery() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesCatalogWatch.class);
assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClient.class);
assertThat(context).doesNotHaveBean(KubernetesReactiveDiscoveryClient.class);
});
}
private void setup(String... properties) {
applicationContextRunner = new ApplicationContextRunner().withConfiguration(
AutoConfigurations.of(KubernetesCatalogWatchAutoConfiguration.class, Fabric8AutoConfiguration.class,
KubernetesCommonsAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class))
.withPropertyValues(properties);
}
}

View File

@@ -0,0 +1,179 @@
/*
* Copyright 2013-2023 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.fabric8.discovery;
import org.junit.jupiter.api.Test;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
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.fabric8.Fabric8AutoConfiguration;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Test various conditionals for {@link KubernetesDiscoveryClientAutoConfiguration}
*
* @author wind57
*/
class KubernetesDiscoveryClientAutoConfigurationApplicationContextTests {
private ApplicationContextRunner applicationContextRunner;
@Test
void discoveryEnabledDefault() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClient.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void discoveryEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=true");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClient.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void discoveryDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClient.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void kubernetesDiscoveryEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.enabled=true");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClient.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void kubernetesDiscoveryDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClient.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void kubernetesDiscoveryBlockingEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=true");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClient.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void kubernetesDiscoveryBlockingDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClient.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void kubernetesDiscoveryHealthIndicatorEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.client.health-indicator.enabled=true");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClient.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void kubernetesDiscoveryHealthIndicatorDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.client.health-indicator.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClient.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
@Test
void kubernetesDiscoveryHealthIndicatorEnabledHealthIndicatorMissing() {
setupWithFilteredClassLoader(HealthIndicator.class, "spring.main.cloud-platform=KUBERNETES",
"spring.cloud.config.enabled=false", "spring.cloud.discovery.client.health-indicator.enabled=true");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClient.class);
assertThat(context).doesNotHaveBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
/**
* reactive is disabled and should not impact blocking in any way
*/
@Test
void reactiveDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.reactive.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClient.class);
assertThat(context).hasSingleBean(KubernetesDiscoveryClientHealthIndicatorInitializer.class);
});
}
private void setup(String... properties) {
applicationContextRunner = new ApplicationContextRunner().withConfiguration(
AutoConfigurations.of(KubernetesDiscoveryClientAutoConfiguration.class, Fabric8AutoConfiguration.class,
KubernetesCommonsAutoConfiguration.class, KubernetesDiscoveryPropertiesAutoConfiguration.class))
.withPropertyValues(properties);
}
private void setupWithFilteredClassLoader(Class<?> cls, String... properties) {
applicationContextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(KubernetesDiscoveryClientAutoConfiguration.class,
Fabric8AutoConfiguration.class, KubernetesCommonsAutoConfiguration.class,
KubernetesDiscoveryPropertiesAutoConfiguration.class))
.withClassLoader(new FilteredClassLoader(cls)).withPropertyValues(properties);
}
}

View File

@@ -28,6 +28,7 @@ import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.kubernetes.commons.PodUtils;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -40,7 +41,7 @@ import static org.mockito.Mockito.when;
* @author Ryan Dawson
* @author Tim Ysewyn
*/
public class KubernetesDiscoveryClientAutoConfigurationPropertiesTests {
class KubernetesDiscoveryClientAutoConfigurationPropertiesTests {
private ConfigurableApplicationContext context;
@@ -80,7 +81,8 @@ public class KubernetesDiscoveryClientAutoConfigurationPropertiesTests {
List<String> envList = new ArrayList<>(Arrays.asList(env));
envList.add("spring.cloud.config.enabled=false");
this.context = new SpringApplicationBuilder(PropertyPlaceholderAutoConfiguration.class,
KubernetesClientTestConfiguration.class, KubernetesDiscoveryClientAutoConfiguration.class)
KubernetesClientTestConfiguration.class, KubernetesDiscoveryClientAutoConfiguration.class,
KubernetesDiscoveryPropertiesAutoConfiguration.class)
.web(org.springframework.boot.WebApplicationType.NONE)
.properties(envList.toArray(new String[0])).run();
}

View File

@@ -0,0 +1,175 @@
/*
* Copyright 2013-2023 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.fabric8.discovery.reactive;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.FilteredClassLoader;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.cloud.client.ReactiveCommonsClientAutoConfiguration;
import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscoveryClientHealthIndicator;
import org.springframework.cloud.commons.util.UtilAutoConfiguration;
import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration;
import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesClientServicesFunction;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Test various conditionals for
* {@link KubernetesReactiveDiscoveryClientAutoConfiguration}
*
* @author wind57
*/
class KubernetesReactiveDiscoveryClientAutoConfigurationApplicationContextTests {
private ApplicationContextRunner applicationContextRunner;
@Test
void discoveryEnabledDefault() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
});
}
@Test
void discoveryEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=true");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
});
}
@Test
void discoveryDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).doesNotHaveBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class);
});
}
@Test
void kubernetesDiscoveryEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.enabled=true");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
});
}
@Test
void kubernetesDiscoveryDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.kubernetes.discovery.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).doesNotHaveBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class);
});
}
@Test
void kubernetesReactiveDiscoveryEnabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.reactive.enabled=true");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
});
}
@Test
void kubernetesReactiveDiscoveryDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.reactive.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).doesNotHaveBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).doesNotHaveBean(KubernetesClientServicesFunction.class);
});
}
/**
* blocking is disabled, and it should not impact reactive in any way.
*/
@Test
void blockingDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.blocking.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).hasSingleBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
});
}
@Test
void healthDisabled() {
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.client.health-indicator.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
});
}
@Test
void healthEnabledClassNotPresent() {
setupWithFilteredClassLoader("org.springframework.boot.actuate.health.ReactiveHealthIndicator",
"spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
"spring.cloud.discovery.client.health-indicator.enabled=false");
applicationContextRunner.run(context -> {
assertThat(context).hasSingleBean(KubernetesReactiveDiscoveryClient.class);
assertThat(context).doesNotHaveBean(ReactiveDiscoveryClientHealthIndicator.class);
assertThat(context).hasSingleBean(KubernetesClientServicesFunction.class);
});
}
private void setup(String... properties) {
applicationContextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(UtilAutoConfiguration.class,
ReactiveCommonsClientAutoConfiguration.class, KubernetesCommonsAutoConfiguration.class,
Fabric8AutoConfiguration.class, KubernetesReactiveDiscoveryClientAutoConfiguration.class,
KubernetesDiscoveryPropertiesAutoConfiguration.class))
.withPropertyValues(properties);
}
private void setupWithFilteredClassLoader(String name, String... properties) {
applicationContextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(UtilAutoConfiguration.class,
ReactiveCommonsClientAutoConfiguration.class, KubernetesCommonsAutoConfiguration.class,
Fabric8AutoConfiguration.class, KubernetesReactiveDiscoveryClientAutoConfiguration.class,
KubernetesDiscoveryPropertiesAutoConfiguration.class))
.withClassLoader(new FilteredClassLoader(name)).withPropertyValues(properties);
}
}

View File

@@ -26,6 +26,7 @@ import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
import org.springframework.cloud.client.discovery.health.reactive.ReactiveDiscoveryClientHealthIndicator;
import org.springframework.cloud.commons.util.UtilAutoConfiguration;
import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration;
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration;
import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration;
import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClientAutoConfiguration;
@@ -40,7 +41,8 @@ class KubernetesReactiveDiscoveryClientAutoConfigurationTests {
.withConfiguration(AutoConfigurations.of(UtilAutoConfiguration.class,
ReactiveCommonsClientAutoConfiguration.class, KubernetesCommonsAutoConfiguration.class,
Fabric8AutoConfiguration.class, KubernetesDiscoveryClientAutoConfiguration.class,
KubernetesReactiveDiscoveryClientAutoConfiguration.class));
KubernetesReactiveDiscoveryClientAutoConfiguration.class,
KubernetesDiscoveryPropertiesAutoConfiguration.class));
@Test
void shouldWorkWithDefaults() {

View File

@@ -46,5 +46,11 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -68,6 +68,11 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>