Skip to content

Commit 22c8279

Browse files
authored
Support discovery with Kubernetes Client (#2542)
1 parent d78155b commit 22c8279

File tree

5 files changed

+58
-12
lines changed

5 files changed

+58
-12
lines changed

spring-boot-admin-server-cloud/src/main/java/de/codecentric/boot/admin/server/cloud/config/AdminServerDiscoveryAutoConfiguration.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.boot.context.properties.ConfigurationProperties;
2727
import org.springframework.cloud.client.discovery.DiscoveryClient;
2828
import org.springframework.cloud.kubernetes.client.discovery.KubernetesInformerDiscoveryClient;
29+
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
2930
import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient;
3031
import org.springframework.context.annotation.Bean;
3132
import org.springframework.context.annotation.Conditional;
@@ -87,8 +88,9 @@ public static class KubernetesConverterConfiguration {
8788

8889
@Bean
8990
@ConfigurationProperties(prefix = "spring.boot.admin.discovery.converter")
90-
public KubernetesServiceInstanceConverter serviceInstanceConverter() {
91-
return new KubernetesServiceInstanceConverter();
91+
public KubernetesServiceInstanceConverter serviceInstanceConverter(
92+
KubernetesDiscoveryProperties discoveryProperties) {
93+
return new KubernetesServiceInstanceConverter(discoveryProperties);
9294
}
9395

9496
}

spring-boot-admin-server-cloud/src/main/java/de/codecentric/boot/admin/server/cloud/discovery/DefaultServiceInstanceConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public class DefaultServiceInstanceConverter implements ServiceInstanceConverter
6868
*/
6969
private String healthEndpointPath = "health";
7070

71-
private static @Nullable String getMetadataValue(ServiceInstance instance, String[] keys) {
71+
protected static @Nullable String getMetadataValue(ServiceInstance instance, String... keys) {
7272
Map<String, String> metadata = instance.getMetadata();
7373
for (String key : keys) {
7474
String value = metadata.get(key);

spring-boot-admin-server-cloud/src/main/java/de/codecentric/boot/admin/server/cloud/discovery/KubernetesServiceInstanceConverter.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,31 @@
1717
package de.codecentric.boot.admin.server.cloud.discovery;
1818

1919
import org.springframework.cloud.client.ServiceInstance;
20+
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
2021

2122
import static org.springframework.util.StringUtils.hasText;
2223

2324
public class KubernetesServiceInstanceConverter extends DefaultServiceInstanceConverter {
2425

26+
public static final String MANAGEMENT_PORT_NAME = "management";
27+
28+
private final String portsPrefix;
29+
30+
public KubernetesServiceInstanceConverter(KubernetesDiscoveryProperties discoveryProperties) {
31+
if (discoveryProperties.metadata() != null && discoveryProperties.metadata().portsPrefix() != null) {
32+
this.portsPrefix = discoveryProperties.metadata().portsPrefix();
33+
}
34+
else {
35+
this.portsPrefix = "";
36+
}
37+
}
38+
2539
@Override
2640
protected int getManagementPort(ServiceInstance instance) {
27-
String managementPort = instance.getMetadata().get("port.management");
41+
// the DiscoveryClient implementation using Kubernetes Client
42+
// (KubernetesInformerDiscoveryClient) currently ignores
43+
// the portsPrefix from KubernetesDiscoveryProperties
44+
String managementPort = getMetadataValue(instance, portsPrefix + MANAGEMENT_PORT_NAME, MANAGEMENT_PORT_NAME);
2845
if (hasText(managementPort)) {
2946
return Integer.parseInt(managementPort);
3047
}

spring-boot-admin-server-cloud/src/test/java/de/codecentric/boot/admin/server/cloud/config/AdminServerDiscoveryAutoConfigurationTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,14 @@
2121
import org.springframework.boot.autoconfigure.AutoConfigurations;
2222
import org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration;
2323
import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration;
24+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2425
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2526
import org.springframework.cloud.client.ServiceInstance;
2627
import org.springframework.cloud.client.discovery.DiscoveryClient;
2728
import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration;
2829
import org.springframework.cloud.commons.util.UtilAutoConfiguration;
2930
import org.springframework.cloud.kubernetes.client.discovery.KubernetesInformerDiscoveryClient;
31+
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
3032
import org.springframework.cloud.kubernetes.fabric8.discovery.KubernetesDiscoveryClient;
3133

3234
import de.codecentric.boot.admin.server.cloud.discovery.DefaultServiceInstanceConverter;
@@ -65,15 +67,16 @@ public void eurekaServiceInstanceConverter() {
6567

6668
@Test
6769
public void officialKubernetesServiceInstanceConverter() {
68-
this.contextRunner
70+
this.contextRunner.withUserConfiguration(KubernetesDiscoveryPropertiesConfiguration.class)
6971
.withBean(KubernetesInformerDiscoveryClient.class, () -> mock(KubernetesInformerDiscoveryClient.class))
7072
.run((context) -> assertThat(context).getBean(ServiceInstanceConverter.class)
7173
.isInstanceOf(KubernetesServiceInstanceConverter.class));
7274
}
7375

7476
@Test
7577
public void fabric8KubernetesServiceInstanceConverter() {
76-
this.contextRunner.withBean(KubernetesDiscoveryClient.class, () -> mock(KubernetesDiscoveryClient.class))
78+
this.contextRunner.withUserConfiguration(KubernetesDiscoveryPropertiesConfiguration.class)
79+
.withBean(KubernetesDiscoveryClient.class, () -> mock(KubernetesDiscoveryClient.class))
7780
.run((context) -> assertThat(context).getBean(ServiceInstanceConverter.class)
7881
.isInstanceOf(KubernetesServiceInstanceConverter.class));
7982
}
@@ -95,4 +98,9 @@ public Registration convert(ServiceInstance instance) {
9598

9699
}
97100

101+
@EnableConfigurationProperties(KubernetesDiscoveryProperties.class)
102+
public static class KubernetesDiscoveryPropertiesConfiguration {
103+
104+
}
105+
98106
}

spring-boot-admin-server-cloud/src/test/java/de/codecentric/boot/admin/server/cloud/discovery/KubernetesServiceInstanceConverterTest.java

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.junit.jupiter.api.Test;
2323
import org.springframework.cloud.client.ServiceInstance;
24+
import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties;
2425

2526
import de.codecentric.boot.admin.server.domain.values.Registration;
2627

@@ -31,16 +32,34 @@
3132
public class KubernetesServiceInstanceConverterTest {
3233

3334
@Test
34-
public void convert_using_port_mgmt() {
35-
ServiceInstance service = mock(ServiceInstance.class);
36-
when(service.getUri()).thenReturn(URI.create("http://localhost:80"));
37-
when(service.getServiceId()).thenReturn("test");
38-
when(service.getMetadata()).thenReturn(Collections.singletonMap("port.management", "9080"));
35+
void convert_using_port_mgmt() {
36+
KubernetesDiscoveryProperties discoveryProperties = KubernetesDiscoveryProperties.DEFAULT;
37+
ServiceInstance service = mockServiceInstanceWithManagementPort(
38+
discoveryProperties.metadata().portsPrefix() + "management");
3939

40-
Registration registration = new KubernetesServiceInstanceConverter().convert(service);
40+
Registration registration = new KubernetesServiceInstanceConverter(discoveryProperties).convert(service);
4141

4242
assertThat(registration.getManagementUrl()).isEqualTo("http://localhost:9080/actuator");
4343
assertThat(registration.getHealthUrl()).isEqualTo("http://localhost:9080/actuator/health");
4444
}
4545

46+
@Test
47+
void fallback_for_port_mgmt() {
48+
KubernetesDiscoveryProperties discoveryProperties = KubernetesDiscoveryProperties.DEFAULT;
49+
ServiceInstance service = mockServiceInstanceWithManagementPort("management");
50+
51+
Registration registration = new KubernetesServiceInstanceConverter(discoveryProperties).convert(service);
52+
53+
assertThat(registration.getManagementUrl()).isEqualTo("http://localhost:9080/actuator");
54+
assertThat(registration.getHealthUrl()).isEqualTo("http://localhost:9080/actuator/health");
55+
}
56+
57+
private static ServiceInstance mockServiceInstanceWithManagementPort(String managementPortName) {
58+
ServiceInstance service = mock(ServiceInstance.class);
59+
when(service.getUri()).thenReturn(URI.create("http://localhost:80"));
60+
when(service.getServiceId()).thenReturn("test");
61+
when(service.getMetadata()).thenReturn(Collections.singletonMap(managementPortName, "9080"));
62+
return service;
63+
}
64+
4665
}

0 commit comments

Comments
 (0)