diff --git a/docs/pom.xml b/docs/pom.xml
index 8884557e..d374b05a 100644
--- a/docs/pom.xml
+++ b/docs/pom.xml
@@ -6,7 +6,7 @@
org.springframework.cloud
spring-cloud-commons-parent
- 1.2.3.BUILD-SNAPSHOT
+ 1.3.0.BUILD-SNAPSHOT
pom
Spring Cloud Commons Docs
diff --git a/docs/src/main/asciidoc/spring-cloud-commons.adoc b/docs/src/main/asciidoc/spring-cloud-commons.adoc
index 38fdab00..b9921306 100644
--- a/docs/src/main/asciidoc/spring-cloud-commons.adoc
+++ b/docs/src/main/asciidoc/spring-cloud-commons.adoc
@@ -317,6 +317,10 @@ Commons provides the `@EnableDiscoveryClient` annotation. This looks for impleme
By default, implementations of `DiscoveryClient` will auto-register the local Spring Boot server with the remote discovery server. This can be disabled by setting `autoRegister=false` in `@EnableDiscoveryClient`.
+==== Health Indicator
+
+Commons creates a Spring Boot `HealthIndicator` that `DiscoveryClient` implementations can participate in by implementing `DiscoveryHealthIndicator`. To disable the composite `HealthIndicator` set `spring.cloud.discovery.client.composite-indicator.enabled=false`. A generic `HealthIndicator` based on `DiscoveryClient` is auto-configured (`DiscoveryClientHealthIndicator). To disable it, set `spring.cloud.discovery.client.health-indicator.enabled=false`. To disable the description field of the `DiscoveryClientHealthIndicator` set `spring.cloud.discovery.client.health-indicator.include-description=false`, otherwise it can bubble up as the `description` of the rolled up `HealthIndicator`.
+
=== ServiceRegistry
Commons now provides a `ServiceRegistry` interface which provides methods like `register(Registration)` and `deregister(Registration)` which allow you to provide custom registered services. `Registration` is a marker interface.
diff --git a/pom.xml b/pom.xml
index b0f3d5e1..cb241b2d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
org.springframework.cloud
spring-cloud-commons-parent
- 1.2.3.BUILD-SNAPSHOT
+ 1.3.0.BUILD-SNAPSHOT
pom
Spring Cloud Commons Parent
Spring Cloud Commons Parent
diff --git a/spring-cloud-commons-dependencies/pom.xml b/spring-cloud-commons-dependencies/pom.xml
index d02ee3ca..d5e0a5a9 100644
--- a/spring-cloud-commons-dependencies/pom.xml
+++ b/spring-cloud-commons-dependencies/pom.xml
@@ -9,7 +9,7 @@
spring-cloud-commons-dependencies
- 1.2.3.BUILD-SNAPSHOT
+ 1.3.0.BUILD-SNAPSHOT
pom
spring-cloud-commons-dependencies
Spring Cloud Commons Dependencies
diff --git a/spring-cloud-commons/pom.xml b/spring-cloud-commons/pom.xml
index bd23e04d..1bc3183a 100644
--- a/spring-cloud-commons/pom.xml
+++ b/spring-cloud-commons/pom.xml
@@ -6,7 +6,7 @@
org.springframework.cloud
spring-cloud-commons-parent
- 1.2.3.BUILD-SNAPSHOT
+ 1.3.0.BUILD-SNAPSHOT
..
spring-cloud-commons
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java
index 53abf1e8..b2b346a0 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/CommonsClientAutoConfiguration.java
@@ -28,10 +28,12 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.actuator.FeaturesEndpoint;
import org.springframework.cloud.client.actuator.HasFeatures;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicator;
+import org.springframework.cloud.client.discovery.health.DiscoveryClientHealthIndicatorProperties;
import org.springframework.cloud.client.discovery.health.DiscoveryCompositeHealthIndicator;
import org.springframework.cloud.client.discovery.health.DiscoveryHealthIndicator;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
@@ -48,6 +50,7 @@ import org.springframework.context.annotation.Configuration;
public class CommonsClientAutoConfiguration {
@Configuration
+ @EnableConfigurationProperties(DiscoveryClientHealthIndicatorProperties.class)
@ConditionalOnClass(HealthIndicator.class)
@ConditionalOnBean(DiscoveryClient.class)
@ConditionalOnProperty(value = "spring.cloud.discovery.enabled", matchIfMissing = true)
@@ -55,8 +58,8 @@ public class CommonsClientAutoConfiguration {
@Bean
@ConditionalOnProperty(value = "spring.cloud.discovery.client.health-indicator.enabled", matchIfMissing = true)
public DiscoveryClientHealthIndicator discoveryClientHealthIndicator(
- DiscoveryClient discoveryClient) {
- return new DiscoveryClientHealthIndicator(discoveryClient);
+ DiscoveryClient discoveryClient, DiscoveryClientHealthIndicatorProperties properties) {
+ return new DiscoveryClientHealthIndicator(discoveryClient, properties);
}
@Bean
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClient.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClient.java
new file mode 100644
index 00000000..ff7cf2de
--- /dev/null
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClient.java
@@ -0,0 +1,73 @@
+package org.springframework.cloud.client.discovery.composite;
+
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+
+/**
+ * A {@link DiscoveryClient} composed of other Discovery Client's and will delegate the
+ * calls to each of them in order
+ *
+ * @author Biju Kunjummen
+ */
+public class CompositeDiscoveryClient implements DiscoveryClient {
+
+ private final List discoveryClients;
+
+ public CompositeDiscoveryClient(List discoveryClients) {
+ this.discoveryClients = discoveryClients;
+ }
+
+ @Override
+ public String description() {
+ return "Composite Discovery Client";
+ }
+
+ @Override
+ public ServiceInstance getLocalServiceInstance() {
+ if (this.discoveryClients != null) {
+ for (DiscoveryClient discoveryClient : discoveryClients) {
+ ServiceInstance serviceInstance = discoveryClient.getLocalServiceInstance();
+ if (serviceInstance != null) {
+ return serviceInstance;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public List getInstances(String serviceId) {
+ if (this.discoveryClients != null) {
+ for (DiscoveryClient discoveryClient : discoveryClients) {
+ List instances = discoveryClient.getInstances(serviceId);
+ if (instances != null && instances.size() > 0) {
+ return instances;
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List getServices() {
+ LinkedHashSet services = new LinkedHashSet<>();
+ if (this.discoveryClients != null) {
+ for (DiscoveryClient discoveryClient : discoveryClients) {
+ List serviceForClient = discoveryClient.getServices();
+ if (serviceForClient != null) {
+ services.addAll(serviceForClient);
+ }
+ }
+ }
+ return new ArrayList<>(services);
+ }
+
+ public List getDiscoveryClients() {
+ return discoveryClients;
+ }
+}
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfiguration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfiguration.java
new file mode 100644
index 00000000..b71d28da
--- /dev/null
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfiguration.java
@@ -0,0 +1,28 @@
+package org.springframework.cloud.client.discovery.composite;
+
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import java.util.List;
+
+/**
+ * Auto-configuration for Composite Discovery Client.
+ *
+ * @author Biju Kunjummen
+ */
+
+@Configuration
+@AutoConfigureBefore(SimpleDiscoveryClientAutoConfiguration.class)
+public class CompositeDiscoveryClientAutoConfiguration {
+
+ @Bean
+ @Primary
+ public CompositeDiscoveryClient compositeDiscoveryClient(List discoveryClients) {
+ return new CompositeDiscoveryClient(discoveryClients);
+ }
+
+}
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicator.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicator.java
index 0c0304ef..75ec4a2b 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicator.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicator.java
@@ -39,10 +39,17 @@ public class DiscoveryClientHealthIndicator implements DiscoveryHealthIndicator,
private int order = Ordered.HIGHEST_PRECEDENCE;
- private DiscoveryClient discoveryClient;
+ private final DiscoveryClient discoveryClient;
+ private final DiscoveryClientHealthIndicatorProperties properties;
+ @Deprecated
public DiscoveryClientHealthIndicator(DiscoveryClient discoveryClient) {
+ this(discoveryClient, new DiscoveryClientHealthIndicatorProperties());
+ }
+
+ public DiscoveryClientHealthIndicator(DiscoveryClient discoveryClient, DiscoveryClientHealthIndicatorProperties properties) {
this.discoveryClient = discoveryClient;
+ this.properties = properties;
}
@Override
@@ -59,7 +66,8 @@ public class DiscoveryClientHealthIndicator implements DiscoveryHealthIndicator,
if (this.discoveryInitialized.get()) {
try {
List services = this.discoveryClient.getServices();
- builder.status(new Status("UP", this.discoveryClient.description()))
+ String description = (this.properties.isIncludeDescription()) ? this.discoveryClient.description() : "";
+ builder.status(new Status("UP", description))
.withDetail("services", services);
}
catch (Exception e) {
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicatorProperties.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicatorProperties.java
new file mode 100644
index 00000000..fed6ddf1
--- /dev/null
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicatorProperties.java
@@ -0,0 +1,40 @@
+package org.springframework.cloud.client.discovery.health;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author Spencer Gibb
+ */
+@ConfigurationProperties("spring.cloud.discovery.client.health-indicator")
+public class DiscoveryClientHealthIndicatorProperties {
+
+ private boolean enabled = true;
+
+ //TODO: change to false in 2.0.0
+ private boolean includeDescription = true;
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public boolean isIncludeDescription() {
+ return includeDescription;
+ }
+
+ public void setIncludeDescription(boolean includeDescription) {
+ this.includeDescription = includeDescription;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuffer sb = new StringBuffer("DiscoveryClientHealthIndicatorProperties{");
+ sb.append("enabled=").append(enabled);
+ sb.append(", includeDescription=").append(includeDescription);
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/simple/SimpleDiscoveryClientAutoConfiguration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/simple/SimpleDiscoveryClientAutoConfiguration.java
index 797f632b..ef7b1ad7 100644
--- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/simple/SimpleDiscoveryClientAutoConfiguration.java
+++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/simple/SimpleDiscoveryClientAutoConfiguration.java
@@ -1,23 +1,23 @@
package org.springframework.cloud.client.discovery.simple;
-import java.net.URI;
-
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration;
import org.springframework.cloud.commons.util.InetUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
import org.springframework.util.ClassUtils;
+import java.net.URI;
+
/**
* Spring Boot Auto-Configuration for Simple Properties based Discovery Client
*
@@ -25,8 +25,6 @@ import org.springframework.util.ClassUtils;
*/
@Configuration
-@ConditionalOnMissingBean(DiscoveryClient.class)
-@EnableConfigurationProperties
@AutoConfigureBefore(NoopDiscoveryClientAutoConfiguration.class)
public class SimpleDiscoveryClientAutoConfiguration {
@@ -54,9 +52,9 @@ public class SimpleDiscoveryClientAutoConfiguration {
}
@Bean
- public DiscoveryClient simpleDiscoveryClient(
- SimpleDiscoveryProperties simpleDiscoveryProperties) {
- return new SimpleDiscoveryClient(simpleDiscoveryProperties);
+ @Order(Ordered.LOWEST_PRECEDENCE)
+ public DiscoveryClient simpleDiscoveryClient() {
+ return new SimpleDiscoveryClient(simpleDiscoveryProperties());
}
private int findPort() {
diff --git a/spring-cloud-commons/src/main/resources/META-INF/spring.factories b/spring-cloud-commons/src/main/resources/META-INF/spring.factories
index 5a433f60..01dc663a 100644
--- a/spring-cloud-commons/src/main/resources/META-INF/spring.factories
+++ b/spring-cloud-commons/src/main/resources/META-INF/spring.factories
@@ -7,6 +7,7 @@ org.springframework.cloud.client.loadbalancer.AsyncLoadBalancerAutoConfiguration
org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration,\
org.springframework.cloud.client.serviceregistry.ServiceRegistryAutoConfiguration,\
org.springframework.cloud.commons.util.UtilAutoConfiguration,\
+org.springframework.cloud.client.discovery.composite.CompositeDiscoveryClientAutoConfiguration,\
org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\
org.springframework.cloud.commons.httpclient.HttpClientConfiguration
diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfigurationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfigurationTests.java
new file mode 100644
index 00000000..f7572297
--- /dev/null
+++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientAutoConfigurationTests.java
@@ -0,0 +1,79 @@
+package org.springframework.cloud.client.discovery.composite;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Composite Discovery Client should be the one found by default.
+ *
+ * @author Biju Kunjummen
+ */
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class CompositeDiscoveryClientAutoConfigurationTests {
+
+ @Autowired
+ private DiscoveryClient discoveryClient;
+
+ @Test
+ public void compositeDiscoveryClientShouldBeTheDefault() {
+ assertThat(discoveryClient).isInstanceOf(CompositeDiscoveryClient.class);
+ CompositeDiscoveryClient compositeDiscoveryClient = (CompositeDiscoveryClient) discoveryClient;
+ assertThat(compositeDiscoveryClient.getDiscoveryClients()).hasSize(2);
+ assertThat(compositeDiscoveryClient.getDiscoveryClients().get(0).description())
+ .isEqualTo("A custom discovery client");
+ }
+
+ @Test
+ public void simpleDiscoveryClientShouldBeHaveTheLowestPrecedence() {
+ CompositeDiscoveryClient compositeDiscoveryClient = (CompositeDiscoveryClient) discoveryClient;
+ assertThat(compositeDiscoveryClient.getDiscoveryClients().get(0).description())
+ .isEqualTo("A custom discovery client");
+ assertThat(compositeDiscoveryClient.getDiscoveryClients().get(1))
+ .isInstanceOf(SimpleDiscoveryClient.class);
+ }
+
+ @EnableAutoConfiguration
+ @Configuration
+ public static class Config {
+
+ @Bean
+ public DiscoveryClient customDiscoveryClient1() {
+ return new DiscoveryClient() {
+ @Override
+ public String description() {
+ return "A custom discovery client";
+ }
+
+ @Override
+ public ServiceInstance getLocalServiceInstance() {
+ return null;
+ }
+
+ @Override
+ public List getInstances(String serviceId) {
+ return null;
+ }
+
+ @Override
+ public List getServices() {
+ return null;
+ }
+ };
+ }
+ }
+}
diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientTests.java
new file mode 100644
index 00000000..bb5a9f24
--- /dev/null
+++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/composite/CompositeDiscoveryClientTests.java
@@ -0,0 +1,116 @@
+package org.springframework.cloud.client.discovery.composite;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.client.DefaultServiceInstance;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.net.URI;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Tests for behavior of Composite Discovery Client
+ *
+ * @author Biju Kunjummen
+ */
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(properties = {
+ "spring.application.name=service0",
+ "spring.cloud.discovery.client.simple.instances.service1[0].uri=http://s1-1:8080",
+ "spring.cloud.discovery.client.simple.instances.service1[1].uri=https://s1-2:8443",
+ "spring.cloud.discovery.client.simple.instances.service2[0].uri=https://s2-1:8080",
+ "spring.cloud.discovery.client.simple.instances.service2[1].uri=https://s2-2:443" })
+public class CompositeDiscoveryClientTests {
+
+ @Autowired
+ private DiscoveryClient discoveryClient;
+
+ @Test
+ public void getInstancesByServiceIdShouldDelegateCall() {
+ assertThat(this.discoveryClient).isInstanceOf(CompositeDiscoveryClient.class);
+
+ assertThat(this.discoveryClient.getInstances("service1")).hasSize(2);
+
+ ServiceInstance s1 = this.discoveryClient.getInstances("service1").get(0);
+ assertThat(s1.getHost()).isEqualTo("s1-1");
+ assertThat(s1.getPort()).isEqualTo(8080);
+ assertThat(s1.getUri()).isEqualTo(URI.create("http://s1-1:8080"));
+ assertThat(s1.isSecure()).isEqualTo(false);
+ }
+
+ @Test
+ public void getServicesShouldAggregateAllServiceNames() {
+ assertThat(this.discoveryClient.getServices()).containsOnlyOnce("service1", "service2", "custom");
+ }
+
+ @Test
+ public void getDescriptionShouldBeComposite() {
+ assertThat(this.discoveryClient.description()).isEqualTo("Composite Discovery Client");
+ }
+
+ @Test
+ public void getInstancesShouldRespectOrder() {
+ assertThat(this.discoveryClient.getInstances("custom")).hasSize(1);
+ assertThat(this.discoveryClient.getInstances("custom")).hasSize(1);
+ }
+
+ @Test
+ public void getInstancesByUnknownServiceIdShouldReturnAnEmptyList() {
+ assertThat(this.discoveryClient.getInstances("unknown")).hasSize(0);
+ }
+
+
+ @Test
+ public void localServiceInstanceShouldReturnTheFirstMatch() {
+ assertThat(this.discoveryClient.getLocalServiceInstance().getServiceId()).isEqualTo("service0");
+ }
+
+ @EnableAutoConfiguration
+ @Configuration
+ public static class Config {
+
+ @Bean
+ @Order(1)
+ public DiscoveryClient customDiscoveryClient() {
+ return new DiscoveryClient() {
+ @Override
+ public String description() {
+ return "A custom discovery client";
+ }
+
+ @Override
+ public ServiceInstance getLocalServiceInstance() {
+ return null;
+ }
+
+ @Override
+ public List getInstances(String serviceId) {
+ if (serviceId.equals("custom")) {
+ ServiceInstance s1 = new DefaultServiceInstance("custom", "host",
+ 123, false);
+ return Arrays.asList(s1);
+ }
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List getServices() {
+ return Arrays.asList("custom");
+ }
+ };
+ }
+ }
+}
diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicatorTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicatorTests.java
new file mode 100644
index 00000000..5a8113af
--- /dev/null
+++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryClientHealthIndicatorTests.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2013-2015 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
+ *
+ * http://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.client.discovery.health;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.boot.actuate.health.HealthAggregator;
+import org.springframework.boot.actuate.health.OrderedHealthAggregator;
+import org.springframework.boot.actuate.health.Status;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.client.CommonsClientAutoConfiguration;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.mock;
+
+/**
+ * @author Spencer Gibb
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = { DiscoveryClientHealthIndicatorTests.Config.class,
+ CommonsClientAutoConfiguration.class }, properties = "spring.cloud.discovery.client.health-indicator.include-description:false")
+public class DiscoveryClientHealthIndicatorTests {
+
+ @Autowired
+ private DiscoveryCompositeHealthIndicator healthIndicator;
+
+ @Autowired
+ private DiscoveryClientHealthIndicator clientHealthIndicator;
+
+ @Configuration
+ @EnableConfigurationProperties
+ public static class Config {
+ @Bean
+ public HealthAggregator healthAggregator() {
+ return new OrderedHealthAggregator();
+ }
+
+ @Bean
+ public DiscoveryClient discoveryClient() {
+ DiscoveryClient mock = mock(DiscoveryClient.class);
+ given(mock.description()).willReturn("TestDiscoveryClient");
+ given(mock.getServices()).willReturn(Arrays.asList("TestService1"));
+ return mock;
+ }
+
+ @Bean
+ public DiscoveryHealthIndicator discoveryHealthIndicator() {
+ return new DiscoveryHealthIndicator() {
+ @Override
+ public String getName() {
+ return "testDiscoveryHealthIndicator";
+ }
+
+ @Override
+ public Health health() {
+ return new Health.Builder().unknown().build();
+ }
+ };
+ }
+ }
+
+ @Test
+ public void testHealthIndicatorDescriptionDisabled() {
+ assertNotNull("healthIndicator was null", this.healthIndicator);
+ Health health = this.healthIndicator.health();
+ assertHealth(health, Status.UNKNOWN);
+
+ clientHealthIndicator.onApplicationEvent(new InstanceRegisteredEvent<>(this, null));
+
+ health = this.healthIndicator.health();
+ Status status = assertHealth(health, Status.UP);
+ assertEquals("status description was wrong", "",
+ status.getDescription());
+ }
+
+ private Status assertHealth(Health health, Status expected) {
+ assertNotNull("health was null", health);
+ Status status = health.getStatus();
+ assertNotNull("status was null", status);
+ assertEquals("status code was wrong", expected.getCode(), status.getCode());
+ return status;
+ }
+}
diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthIndicatorTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthIndicatorTests.java
index b4e09988..b1eb25df 100644
--- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthIndicatorTests.java
+++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/discovery/health/DiscoveryCompositeHealthIndicatorTests.java
@@ -16,42 +16,41 @@
package org.springframework.cloud.client.discovery.health;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.mock;
-
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.SpringApplication;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthAggregator;
import org.springframework.boot.actuate.health.OrderedHealthAggregator;
import org.springframework.boot.actuate.health.Status;
+import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.CommonsClientAutoConfiguration;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
-import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Mockito.mock;
+
/**
* @author Spencer Gibb
*/
@RunWith(SpringRunner.class)
-@ContextConfiguration(classes = { DiscoveryCompositeHealthIndicatorTests.Config.class,
+@SpringBootTest(classes = { DiscoveryCompositeHealthIndicatorTests.Config.class,
CommonsClientAutoConfiguration.class })
public class DiscoveryCompositeHealthIndicatorTests {
@Autowired
- DiscoveryCompositeHealthIndicator healthIndicator;
+ private DiscoveryCompositeHealthIndicator healthIndicator;
@Autowired
- DiscoveryClientHealthIndicator clientHealthIndicator;
+ private DiscoveryClientHealthIndicator clientHealthIndicator;
@Configuration
public static class Config {
@@ -90,11 +89,11 @@ public class DiscoveryCompositeHealthIndicatorTests {
Health health = this.healthIndicator.health();
assertHealth(health, Status.UNKNOWN);
- clientHealthIndicator.onApplicationEvent(new InstanceRegisteredEvent