From 4023dfbd30dfa0e24441319298b997c65f9b7820 Mon Sep 17 00:00:00 2001 From: Joseph Athman Date: Fri, 1 Apr 2016 09:41:48 -0500 Subject: [PATCH] Add the ability to pass along query parameters to Consul when discovering services. One potential use is for passing a different data center value than the default value. --- .../discovery/ConsulDiscoveryClient.java | 15 +++++--- .../discovery/ConsulDiscoveryClientTests.java | 34 ++++++++++++++++--- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java index 775a4c98..73abc575 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClient.java @@ -41,6 +41,7 @@ import static org.springframework.cloud.consul.discovery.ConsulServerUtils.getMe /** * @author Spencer Gibb + * @author Joe Athman */ @CommonsLog public class ConsulDiscoveryClient implements DiscoveryClient { @@ -110,16 +111,22 @@ public class ConsulDiscoveryClient implements DiscoveryClient { @Override public List getInstances(final String serviceId) { + return getInstances(serviceId, QueryParams.DEFAULT); + } + + public List getInstances(final String serviceId, + final QueryParams queryParams) { List instances = new ArrayList<>(); - addInstancesToList(instances, serviceId); + addInstancesToList(instances, serviceId, queryParams); return instances; } - private void addInstancesToList(List instances, String serviceId) { + private void addInstancesToList(List instances, String serviceId, + QueryParams queryParams) { Response> services = client.getHealthServices(serviceId, - this.properties.isQueryPassing(), QueryParams.DEFAULT); + this.properties.isQueryPassing(), queryParams); for (HealthService service : services.getValue()) { String host = findHost(service); instances.add(new DefaultServiceInstance(serviceId, host, service @@ -133,7 +140,7 @@ public class ConsulDiscoveryClient implements DiscoveryClient { Response>> services = client .getCatalogServices(QueryParams.DEFAULT); for (String serviceId : services.getValue().keySet()) { - addInstancesToList(instances, serviceId); + addInstancesToList(instances, serviceId, QueryParams.DEFAULT); } return instances; } diff --git a/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClientTests.java b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClientTests.java index 38005ef5..c4bb18c4 100644 --- a/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClientTests.java +++ b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/discovery/ConsulDiscoveryClientTests.java @@ -16,8 +16,6 @@ package org.springframework.cloud.consul.discovery; -import static org.junit.Assert.*; - import java.util.List; import org.junit.Test; @@ -33,17 +31,28 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import com.ecwid.consul.v1.ConsulClient; +import com.ecwid.consul.v1.QueryParams; +import com.ecwid.consul.v1.Response; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + /** * @author Spencer Gibb + * @author Joe Athman */ @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = ConsulDiscoveryClientTests.MyTestConfig.class) -@WebIntegrationTest(value = {"spring.application.name=testConsulDiscovery", - "spring.cloud.consul.discovery.preferIpAddress=true"}, randomPort = true) +@WebIntegrationTest(value = { "spring.application.name=testConsulDiscovery", + "spring.cloud.consul.discovery.preferIpAddress=true" }, randomPort = true) public class ConsulDiscoveryClientTests { @Autowired private ConsulDiscoveryClient discoveryClient; + @Autowired + private ConsulClient consulClient; @Test public void getInstancesForServiceWorks() { @@ -55,8 +64,23 @@ public class ConsulDiscoveryClientTests { assertIpAddress(instance); } + @Test + public void getInstancesForServiceRespectsQueryParams() { + Response> catalogDatacenters = consulClient.getCatalogDatacenters(); + + List dataCenterList = catalogDatacenters.getValue(); + assertFalse("no data centers found", dataCenterList.isEmpty()); + List instances = discoveryClient.getInstances("consul", + new QueryParams(dataCenterList.get(0))); + assertFalse("instances was empty", instances.isEmpty()); + + ServiceInstance instance = instances.get(0); + assertIpAddress(instance); + } + private void assertIpAddress(ServiceInstance instance) { - assertTrue("host isn't an ip address", Character.isDigit(instance.getHost().charAt(0))); + assertTrue("host isn't an ip address", + Character.isDigit(instance.getHost().charAt(0))); } @Test