Skip to content

Commit 3bdae18

Browse files
committed
fabric8 fix and tests
Signed-off-by: wind57 <[email protected]>
1 parent a75f090 commit 3bdae18

File tree

2 files changed

+58
-9
lines changed

2 files changed

+58
-9
lines changed

spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8ReactiveDiscoveryClientAutoConfiguration.java

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2626
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
27+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2728
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2829
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2930
import org.springframework.cloud.client.ConditionalOnDiscoveryHealthIndicatorEnabled;
@@ -77,6 +78,16 @@ Fabric8ReactiveDiscoveryClient fabric8ReactiveDiscoveryClient(KubernetesClient c
7778
return new Fabric8ReactiveDiscoveryClient(fabric8DiscoveryClient);
7879
}
7980

81+
@Bean
82+
@ConditionalOnBean(Fabric8ReactiveDiscoveryClient.class)
83+
@ConditionalOnSpringCloudKubernetesReactiveDiscoveryHealthInitializer
84+
ReactiveDiscoveryClientHealthIndicator kubernetesReactiveDiscoveryClientHealthIndicator(
85+
Fabric8ReactiveDiscoveryClient client, DiscoveryClientHealthIndicatorProperties properties) {
86+
return new ReactiveDiscoveryClientHealthIndicator(client, properties);
87+
}
88+
89+
// Above two beans are created when cacheable is disabled
90+
8091
@Bean
8192
@ConditionalOnMissingBean
8293
@ConditionalOnDiscoveryCacheableReactiveEnabled
@@ -89,23 +100,41 @@ Fabric8CacheableReactiveDiscoveryClient fabric8CacheableReactiveDiscoveryClient(
89100
return new Fabric8CacheableReactiveDiscoveryClient(fabric8DiscoveryClient);
90101
}
91102

103+
@Bean
104+
@ConditionalOnMissingBean(Fabric8ReactiveDiscoveryClient.class)
105+
@ConditionalOnSpringCloudKubernetesReactiveDiscoveryHealthInitializer
106+
ReactiveDiscoveryClientHealthIndicator kubernetesReactiveClientHealthIndicator(
107+
KubernetesClient client, KubernetesDiscoveryProperties kubernetesDiscoveryProperties,
108+
Predicate<Service> predicate, DiscoveryClientHealthIndicatorProperties properties, Environment environment) {
109+
110+
KubernetesNamespaceProvider namespaceProvider = new KubernetesNamespaceProvider(environment);
111+
ServicePortSecureResolver servicePortSecureResolver = new ServicePortSecureResolver(kubernetesDiscoveryProperties);
112+
Fabric8DiscoveryClient fabric8DiscoveryClient =
113+
new Fabric8DiscoveryClient(client, kubernetesDiscoveryProperties,
114+
servicePortSecureResolver, namespaceProvider, predicate);
115+
116+
Fabric8ReactiveDiscoveryClient fabric8ReactiveDiscoveryClient =
117+
new Fabric8ReactiveDiscoveryClient(fabric8DiscoveryClient);
118+
119+
return new ReactiveDiscoveryClientHealthIndicator(fabric8ReactiveDiscoveryClient, properties);
120+
}
121+
122+
// Above two beans are created when cacheable is enabled. In this case, we can't make
123+
// Fabric8DiscoveryClient a @Bean, since blocking discovery might be disabled and we do
124+
// not want to allow wiring of it. Nevertheless, we still need an instance of Fabric8DiscoveryClient
125+
// in order to create the ReactiveDiscoveryClientHealthIndicator and Fabric8CacheableReactiveDiscoveryClient
126+
// As such, we create two of such instances in each bean.
127+
92128
/**
93129
* Post an event so that health indicator is initialized.
94130
*/
95131
@Bean
96132
@ConditionalOnClass(name = "org.springframework.boot.health.contributor.ReactiveHealthIndicator")
97133
@ConditionalOnDiscoveryHealthIndicatorEnabled
98134
KubernetesDiscoveryClientHealthIndicatorInitializer reactiveIndicatorInitializer(
99-
ApplicationEventPublisher applicationEventPublisher, PodUtils<?> podUtils) {
135+
ApplicationEventPublisher applicationEventPublisher, PodUtils<?> podUtils) {
100136
LOG.debug(() -> "Will publish InstanceRegisteredEvent from reactive implementation");
101137
return new KubernetesDiscoveryClientHealthIndicatorInitializer(podUtils, applicationEventPublisher);
102138
}
103139

104-
@Bean
105-
@ConditionalOnSpringCloudKubernetesReactiveDiscoveryHealthInitializer
106-
ReactiveDiscoveryClientHealthIndicator kubernetesReactiveDiscoveryClientHealthIndicator(
107-
Fabric8ReactiveDiscoveryClient client, DiscoveryClientHealthIndicatorProperties properties) {
108-
return new ReactiveDiscoveryClientHealthIndicator(client, properties);
109-
}
110-
111140
}

spring-cloud-kubernetes-fabric8-discovery/src/test/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8ReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,11 @@ void reactiveCacheableDisabled() {
180180
* - cacheable in the reactive implementation = true, as such:
181181
* - Fabric8ReactiveDiscoveryClient is not present
182182
* - Fabric8CacheableReactiveDiscoveryClient is present
183+
* - Health indicator is disabled
183184
* </pre>
184185
*/
185186
@Test
186-
void reactiveCacheableEnabled() {
187+
void reactiveCacheableEnabledWithoutHealthIndicator() {
187188
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
188189
"spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=true",
189190
"spring.cloud.discovery.client.health-indicator.enabled=false");
@@ -193,6 +194,25 @@ void reactiveCacheableEnabled() {
193194
});
194195
}
195196

197+
/**
198+
* <pre>
199+
* - cacheable in the reactive implementation = true, as such:
200+
* - Fabric8ReactiveDiscoveryClient is not present
201+
* - Fabric8CacheableReactiveDiscoveryClient is present
202+
* - Health indicator is enabled
203+
* </pre>
204+
*/
205+
@Test
206+
void reactiveCacheableEnabledWithHealthIndicator() {
207+
setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false",
208+
"spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=true",
209+
"spring.cloud.discovery.client.health-indicator.enabled=true");
210+
applicationContextRunner.run(context -> {
211+
assertThat(context).doesNotHaveBean(Fabric8ReactiveDiscoveryClient.class);
212+
assertThat(context).hasSingleBean(Fabric8CacheableReactiveDiscoveryClient.class);
213+
});
214+
}
215+
196216
private void setup(String... properties) {
197217
applicationContextRunner = new ApplicationContextRunner()
198218
.withConfiguration(AutoConfigurations.of(UtilAutoConfiguration.class,

0 commit comments

Comments
 (0)