From 4bf64f7005b86d25d4be606d630bc7187b7966bc Mon Sep 17 00:00:00 2001 From: Matthew Jenkins Date: Thu, 15 Sep 2016 21:20:35 -0400 Subject: [PATCH] Use statusPage/healthCheckUrlPath w/ custom management.port (#1349) Use statusPage/healthCheckUrlPath w/ custom management.port Added RelaxedPropertyResolver to handle multiple valid formats for eureka properties. Added tests. Fixes gh-1348 --- .../eureka/EurekaClientAutoConfiguration.java | 11 +++ .../EurekaClientAutoConfigurationTests.java | 73 +++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java index 8378efc8..9f6e5c26 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfiguration.java @@ -33,6 +33,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.SearchStrategy; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.autoconfigure.RefreshAutoConfiguration; import org.springframework.cloud.client.CommonsClientAutoConfiguration; @@ -62,6 +63,7 @@ import static org.springframework.cloud.commons.util.IdUtils.getDefaultInstanceI * @author Dave Syer * @author Spencer Gibb * @author Jon Schneider + * @author Matt Jenkins */ @Configuration @EnableConfigurationProperties @@ -104,6 +106,7 @@ public class EurekaClientAutoConfiguration { @Bean @ConditionalOnMissingBean(value = EurekaInstanceConfig.class, search = SearchStrategy.CURRENT) public EurekaInstanceConfigBean eurekaInstanceConfigBean(InetUtils inetUtils) { + RelaxedPropertyResolver relaxedPropertyResolver = new RelaxedPropertyResolver(env, "eureka.instance."); EurekaInstanceConfigBean instance = new EurekaInstanceConfigBean(inetUtils); instance.setNonSecurePort(this.nonSecurePort); instance.setInstanceId(getDefaultInstanceId(this.env)); @@ -111,6 +114,14 @@ public class EurekaClientAutoConfiguration { if (StringUtils.hasText(this.hostname)) { instance.setHostname(this.hostname); } + String statusPageUrlPath = relaxedPropertyResolver.getProperty("statusPageUrlPath"); + String healthCheckUrlPath = relaxedPropertyResolver.getProperty("healthCheckUrlPath"); + if (StringUtils.hasText(statusPageUrlPath)) { + instance.setStatusPageUrlPath(statusPageUrlPath); + } + if (StringUtils.hasText(healthCheckUrlPath)) { + instance.setHealthCheckUrlPath(healthCheckUrlPath); + } String scheme = instance.getSecurePortEnabled() ? "https" : "http"; instance.setStatusPageUrl(scheme + "://" + instance.getHostname() + ":" + this.managementPort + instance.getStatusPageUrlPath()); diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java index 9363bec9..c1a15915 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/EurekaClientAutoConfigurationTests.java @@ -39,6 +39,7 @@ import static org.springframework.boot.test.util.EnvironmentTestUtils.addEnviron /** * @author Spencer Gibb + * @author Matt Jenkins */ public class EurekaClientAutoConfigurationTests { private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); @@ -87,6 +88,78 @@ public class EurekaClientAutoConfigurationTests { instance.getStatusPageUrl().contains("9999")); } + @Test + public void statusPageUrlPathAndManagementPort() { + EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989", + "management.port=9999", + "eureka.instance.statusPageUrlPath=/myStatusPage"); + setupContext(RefreshAutoConfiguration.class); + EurekaInstanceConfigBean instance = this.context + .getBean(EurekaInstanceConfigBean.class); + assertTrue("Wrong status page: " + instance.getStatusPageUrl(), + instance.getStatusPageUrl().contains("/myStatusPage")); + } + + @Test + public void healthCheckUrlPathAndManagementPort() { + EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989", + "management.port=9999", + "eureka.instance.healthCheckUrlPath=/myHealthCheck"); + setupContext(RefreshAutoConfiguration.class); + EurekaInstanceConfigBean instance = this.context + .getBean(EurekaInstanceConfigBean.class); + assertTrue("Wrong health check: " + instance.getHealthCheckUrl(), + instance.getHealthCheckUrl().contains("/myHealthCheck")); + } + + @Test + public void statusPageUrlPathAndManagementPortKabobCase() { + EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989", + "management.port=9999", + "eureka.instance.status-page-url-path=/myStatusPage"); + setupContext(RefreshAutoConfiguration.class); + EurekaInstanceConfigBean instance = this.context + .getBean(EurekaInstanceConfigBean.class); + assertTrue("Wrong status page: " + instance.getStatusPageUrl(), + instance.getStatusPageUrl().contains("/myStatusPage")); + } + + @Test + public void healthCheckUrlPathAndManagementPortKabobCase() { + EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989", + "management.port=9999", + "eureka.instance.health-check-url-path=/myHealthCheck"); + setupContext(RefreshAutoConfiguration.class); + EurekaInstanceConfigBean instance = this.context + .getBean(EurekaInstanceConfigBean.class); + assertTrue("Wrong health check: " + instance.getHealthCheckUrl(), + instance.getHealthCheckUrl().contains("/myHealthCheck")); + } + + @Test + public void statusPageUrlPathAndManagementPortUpperCase() { + EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989", + "management.port=9999", + "EUREKA_INSTANCE_STATUS_PAGE_URL_PATH=/myStatusPage"); + setupContext(RefreshAutoConfiguration.class); + EurekaInstanceConfigBean instance = this.context + .getBean(EurekaInstanceConfigBean.class); + assertTrue("Wrong status page: " + instance.getStatusPageUrl(), + instance.getStatusPageUrl().contains("/myStatusPage")); + } + + @Test + public void healthCheckUrlPathAndManagementPortUpperCase() { + EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989", + "management.port=9999", + "EUREKA_INSTANCE_HEALTH_CHECK_URL_PATH=/myHealthCheck"); + setupContext(RefreshAutoConfiguration.class); + EurekaInstanceConfigBean instance = this.context + .getBean(EurekaInstanceConfigBean.class); + assertTrue("Wrong health check: " + instance.getHealthCheckUrl(), + instance.getHealthCheckUrl().contains("/myHealthCheck")); + } + @Test public void hostname() { EnvironmentTestUtils.addEnvironment(this.context, "server.port=8989",