diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/DomainExtractingServerList.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/DomainExtractingServerList.java index e6041c7c..096a5e78 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/DomainExtractingServerList.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/DomainExtractingServerList.java @@ -18,6 +18,8 @@ package org.springframework.cloud.netflix.ribbon.eureka; import java.util.ArrayList; import java.util.List; +import com.netflix.client.config.CommonClientConfigKey; +import com.netflix.client.config.IClientConfig; import lombok.Getter; import lombok.Setter; @@ -34,73 +36,79 @@ import com.netflix.niws.loadbalancer.DiscoveryEnabledServer; */ public class DomainExtractingServerList implements ServerList { - private ServerList list; + private ServerList list; + private IClientConfig clientConfig; - public DomainExtractingServerList(ServerList list) { - this.list = list; - } + public DomainExtractingServerList(ServerList list, IClientConfig clientConfig) { + this.list = list; + this.clientConfig = clientConfig; + } - @Override - public List getInitialListOfServers() { - List servers = setZones(list.getInitialListOfServers()); - return servers; - } + @Override + public List getInitialListOfServers() { + List servers = setZones(list.getInitialListOfServers()); + return servers; + } - @Override - public List getUpdatedListOfServers() { - List servers = setZones(list.getUpdatedListOfServers()); - return servers; - } + @Override + public List getUpdatedListOfServers() { + List servers = setZones(list.getUpdatedListOfServers()); + return servers; + } - private List setZones(List servers) { - List result = new ArrayList(); - for (Server server : servers) { - if (server instanceof DiscoveryEnabledServer) { - result.add(new DomainExtractingServer((DiscoveryEnabledServer) server)); - } - else { - result.add(server); - } - } - return result; - } + private List setZones(List servers) { + List result = new ArrayList<>(); + boolean isSecure = clientConfig.getPropertyAsBoolean(CommonClientConfigKey.IsSecure, Boolean.TRUE); + boolean shouldUseIpAddr = clientConfig.getPropertyAsBoolean(CommonClientConfigKey.UseIPAddrForServer, Boolean.FALSE); + for (Server server : servers) { + if (server instanceof DiscoveryEnabledServer) { + result.add(new DomainExtractingServer((DiscoveryEnabledServer) server, + isSecure, shouldUseIpAddr)); + } + else { + result.add(server); + } + } + return result; + } } class DomainExtractingServer extends DiscoveryEnabledServer { - @Getter - @Setter - private String id; + @Getter + @Setter + private String id; - public DomainExtractingServer(DiscoveryEnabledServer server) { - super(server.getInstanceInfo(), true, false); - setZone(extractApproximateZone(server)); - setId(extractId(server)); - } + public DomainExtractingServer(DiscoveryEnabledServer server, boolean useSecurePort, boolean useIpAddr) { + super(server.getInstanceInfo(), useSecurePort, useIpAddr); + setZone(extractApproximateZone(server)); + setId(extractId(server)); + } - private String extractId(Server server) { - if (server instanceof DiscoveryEnabledServer) { - DiscoveryEnabledServer enabled = (DiscoveryEnabledServer) server; - InstanceInfo instance = enabled.getInstanceInfo(); - if (instance.getMetadata().containsKey("instanceId")) { - return instance.getMetadata().get("instanceId"); - } - } - return server.getId(); - } + private String extractId(Server server) { + if (server instanceof DiscoveryEnabledServer) { + DiscoveryEnabledServer enabled = (DiscoveryEnabledServer) server; + InstanceInfo instance = enabled.getInstanceInfo(); + if (instance.getMetadata().containsKey("instanceId")) { + return instance.getMetadata().get("instanceId"); + } + } + return super.getId(); + } - private String extractApproximateZone(Server server) { - String host = server.getHost(); - if (!host.contains(".")) { - return host; - } - String[] split = StringUtils.split(host, "."); - StringBuilder builder = new StringBuilder(split[1]); - for (int i = 2; i < split.length; i++) { - builder.append(".").append(split[i]); - } - return builder.toString(); - } + private String extractApproximateZone(Server server) { + String host = server.getHost(); + if (!host.contains(".")) { + return host; + } + String[] split = StringUtils.split(host, "."); + StringBuilder builder = new StringBuilder(split[1]); + for (int i = 2; i < split.length; i++) { + builder.append(".").append(split[i]); + } + return builder.toString(); + } } + diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessor.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessor.java index e8dc3914..cedccd9e 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessor.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/eureka/EurekaRibbonClientPreprocessor.java @@ -81,7 +81,7 @@ public class EurekaRibbonClientPreprocessor implements RibbonClientPreprocessor // the server zone is populated. TODO: find a way to back off if AWS // metadata *is* available. // @see com.netflix.appinfo.AmazonInfo.Builder - dynamic.setServerListImpl(new DomainExtractingServerList(list)); + dynamic.setServerListImpl(new DomainExtractingServerList(list, dynamic.getClientConfig())); } } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/DomainExtractingServerListTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/DomainExtractingServerListTests.java new file mode 100644 index 00000000..04f0c2a7 --- /dev/null +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/eureka/DomainExtractingServerListTests.java @@ -0,0 +1,83 @@ +package org.springframework.cloud.netflix.ribbon.eureka; + +import com.google.common.collect.ImmutableMap; +import com.netflix.appinfo.InstanceInfo; +import com.netflix.client.config.CommonClientConfigKey; +import com.netflix.client.config.DefaultClientConfigImpl; +import com.netflix.loadbalancer.Server; +import com.netflix.loadbalancer.ServerList; +import com.netflix.niws.loadbalancer.DiscoveryEnabledServer; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.*; + +/** + * @author Spencer Gibb + */ +public class DomainExtractingServerListTests { + + static final String IP_ADDR = "10.0.0.2"; + static final int PORT = 8080; + static final String ZONE = "myzone.mydomain.com"; + static final String HOST_NAME = "myHostName."+ZONE; + static final String INSTANCE_ID = "myInstanceId"; + + @Test + public void testDomainExtractingServer() { + DomainExtractingServerList serverList = getDomainExtractingServerList(new DefaultClientConfigImpl()); + + List servers = serverList.getInitialListOfServers(); + assertNotNull("servers was null", servers); + assertEquals("servers was not size 1", 1, servers.size()); + + DomainExtractingServer des = assertDomainExtractingServer(servers); + assertEquals("hostPort was wrong", HOST_NAME+":"+PORT, des.getHostPort()); + } + + protected DomainExtractingServer assertDomainExtractingServer(List servers) { + Server actualServer = servers.get(0); + assertTrue("server was not a DomainExtractingServer", actualServer instanceof DomainExtractingServer); + DomainExtractingServer des = DomainExtractingServer.class.cast(actualServer); + assertEquals("zone was wrong", ZONE, des.getZone()); + assertEquals("instanceId was wrong", INSTANCE_ID, des.getId()); + return des; + } + + @Test + public void testDomainExtractingServerUseIpAddress() { + DefaultClientConfigImpl config = new DefaultClientConfigImpl(); + config.setProperty(CommonClientConfigKey.UseIPAddrForServer, true); + DomainExtractingServerList serverList = getDomainExtractingServerList(config); + + List servers = serverList.getInitialListOfServers(); + assertNotNull("servers was null", servers); + assertEquals("servers was not size 1", 1, servers.size()); + + DomainExtractingServer des = assertDomainExtractingServer(servers); + assertEquals("hostPort was wrong", IP_ADDR+":"+PORT, des.getHostPort()); + } + + protected DomainExtractingServerList getDomainExtractingServerList(DefaultClientConfigImpl config) { + DiscoveryEnabledServer server = mock(DiscoveryEnabledServer.class); + ServerList originalServerList = mock(ServerList.class); + InstanceInfo instanceInfo = mock(InstanceInfo.class); + + when(server.getInstanceInfo()).thenReturn(instanceInfo); + when(server.getHost()).thenReturn(HOST_NAME); + + when(instanceInfo.getMetadata()).thenReturn(ImmutableMap.builder().put("instanceId", INSTANCE_ID).build()); + when(instanceInfo.getHostName()).thenReturn(HOST_NAME); + when(instanceInfo.getIPAddr()).thenReturn(IP_ADDR); + when(instanceInfo.getPort()).thenReturn(PORT); + + when(originalServerList.getInitialListOfServers()).thenReturn(Arrays.asList(server)); + + return new DomainExtractingServerList(originalServerList, config); + } + +}