package com.netflix.discovery; import com.netflix.appinfo.AmazonInfo; import com.netflix.appinfo.InstanceInfo; import com.netflix.appinfo.LeaseInfo; import com.netflix.discovery.junit.resource.DiscoveryClientResource; import com.netflix.discovery.shared.Application; import org.junit.Rule; import javax.annotation.Nullable; import java.util.Arrays; import java.util.List; /** * @author Nitesh Kant */ public abstract class BaseDiscoveryClientTester { public static final String REMOTE_REGION = "myregion"; public static final String REMOTE_ZONE = "myzone"; public static final int CLIENT_REFRESH_RATE = 10; public static final String ALL_REGIONS_VIP1_ADDR = "myvip1"; public static final String REMOTE_REGION_APP1_INSTANCE1_HOSTNAME = "blah1-1"; public static final String REMOTE_REGION_APP1_INSTANCE2_HOSTNAME = "blah1-2"; public static final String LOCAL_REGION_APP1_NAME = "MYAPP1_LOC"; public static final String LOCAL_REGION_APP1_INSTANCE1_HOSTNAME = "blahloc1-1"; public static final String LOCAL_REGION_APP1_INSTANCE2_HOSTNAME = "blahloc1-2"; public static final String REMOTE_REGION_APP1_NAME = "MYAPP1"; public static final String ALL_REGIONS_VIP2_ADDR = "myvip2"; public static final String REMOTE_REGION_APP2_INSTANCE1_HOSTNAME = "blah2-1"; public static final String REMOTE_REGION_APP2_INSTANCE2_HOSTNAME = "blah2-2"; public static final String LOCAL_REGION_APP2_NAME = "MYAPP2_LOC"; public static final String LOCAL_REGION_APP2_INSTANCE1_HOSTNAME = "blahloc2-1"; public static final String LOCAL_REGION_APP2_INSTANCE2_HOSTNAME = "blahloc2-2"; public static final String REMOTE_REGION_APP2_NAME = "MYAPP2"; public static final String ALL_REGIONS_VIP3_ADDR = "myvip3"; public static final String LOCAL_REGION_APP3_NAME = "MYAPP3_LOC"; public static final String LOCAL_REGION_APP3_INSTANCE1_HOSTNAME = "blahloc3-1"; @Rule public MockRemoteEurekaServer mockLocalEurekaServer = new MockRemoteEurekaServer(); protected EurekaClient client; protected void setupProperties() { DiscoveryClientResource.setupDiscoveryClientConfig(mockLocalEurekaServer.getPort(), MockRemoteEurekaServer.EUREKA_API_BASE_PATH); } protected void setupDiscoveryClient() { setupDiscoveryClient(30); } protected void setupDiscoveryClient(int renewalIntervalInSecs) { InstanceInfo instanceInfo = newInstanceInfoBuilder(renewalIntervalInSecs).build(); client = DiscoveryClientResource.setupDiscoveryClient(instanceInfo); } protected InstanceInfo.Builder newInstanceInfoBuilder(int renewalIntervalInSecs) { return DiscoveryClientResource.newInstanceInfoBuilder(renewalIntervalInSecs); } protected void shutdownDiscoveryClient() { if (client != null) { client.shutdown(); } } protected void addLocalAppDelta() { Application myappDelta = new Application(LOCAL_REGION_APP3_NAME); InstanceInfo instanceInfo = createInstance(LOCAL_REGION_APP3_NAME, ALL_REGIONS_VIP3_ADDR, LOCAL_REGION_APP3_INSTANCE1_HOSTNAME, null); instanceInfo.setActionType(InstanceInfo.ActionType.ADDED); myappDelta.addInstance(instanceInfo); mockLocalEurekaServer.addLocalRegionAppsDelta(LOCAL_REGION_APP3_NAME, myappDelta); } protected void populateLocalRegistryAtStartup() { for (Application app : createLocalApps()) { mockLocalEurekaServer.addLocalRegionApps(app.getName(), app); } for (Application appDelta : createLocalAppsDelta()) { mockLocalEurekaServer.addLocalRegionAppsDelta(appDelta.getName(), appDelta); } } protected void populateRemoteRegistryAtStartup() { for (Application app : createRemoteApps()) { mockLocalEurekaServer.addRemoteRegionApps(app.getName(), app); } for (Application appDelta : createRemoteAppsDelta()) { mockLocalEurekaServer.addRemoteRegionAppsDelta(appDelta.getName(), appDelta); } } protected static List<Application> createRemoteApps() { Application myapp1 = new Application(REMOTE_REGION_APP1_NAME); InstanceInfo instanceInfo1 = createInstance(REMOTE_REGION_APP1_NAME, ALL_REGIONS_VIP1_ADDR, REMOTE_REGION_APP1_INSTANCE1_HOSTNAME, REMOTE_ZONE); myapp1.addInstance(instanceInfo1); Application myapp2 = new Application(REMOTE_REGION_APP2_NAME); InstanceInfo instanceInfo2 = createInstance(REMOTE_REGION_APP2_NAME, ALL_REGIONS_VIP2_ADDR, REMOTE_REGION_APP2_INSTANCE1_HOSTNAME, REMOTE_ZONE); myapp2.addInstance(instanceInfo2); return Arrays.asList(myapp1, myapp2); } protected static List<Application> createRemoteAppsDelta() { Application myapp1 = new Application(REMOTE_REGION_APP1_NAME); InstanceInfo instanceInfo1 = createInstance(REMOTE_REGION_APP1_NAME, ALL_REGIONS_VIP1_ADDR, REMOTE_REGION_APP1_INSTANCE2_HOSTNAME, REMOTE_ZONE); instanceInfo1.setActionType(InstanceInfo.ActionType.ADDED); myapp1.addInstance(instanceInfo1); Application myapp2 = new Application(REMOTE_REGION_APP2_NAME); InstanceInfo instanceInfo2 = createInstance(REMOTE_REGION_APP2_NAME, ALL_REGIONS_VIP2_ADDR, REMOTE_REGION_APP2_INSTANCE2_HOSTNAME, REMOTE_ZONE); instanceInfo2.setActionType(InstanceInfo.ActionType.ADDED); myapp2.addInstance(instanceInfo2); return Arrays.asList(myapp1, myapp2); } protected static List<Application> createLocalApps() { Application myapp1 = new Application(LOCAL_REGION_APP1_NAME); InstanceInfo instanceInfo1 = createInstance(LOCAL_REGION_APP1_NAME, ALL_REGIONS_VIP1_ADDR, LOCAL_REGION_APP1_INSTANCE1_HOSTNAME, null); myapp1.addInstance(instanceInfo1); Application myapp2 = new Application(LOCAL_REGION_APP2_NAME); InstanceInfo instanceInfo2 = createInstance(LOCAL_REGION_APP2_NAME, ALL_REGIONS_VIP2_ADDR, LOCAL_REGION_APP2_INSTANCE1_HOSTNAME, null); myapp2.addInstance(instanceInfo2); return Arrays.asList(myapp1, myapp2); } protected static List<Application> createLocalAppsDelta() { Application myapp1 = new Application(LOCAL_REGION_APP1_NAME); InstanceInfo instanceInfo1 = createInstance(LOCAL_REGION_APP1_NAME, ALL_REGIONS_VIP1_ADDR, LOCAL_REGION_APP1_INSTANCE2_HOSTNAME, null); instanceInfo1.setActionType(InstanceInfo.ActionType.ADDED); myapp1.addInstance(instanceInfo1); Application myapp2 = new Application(LOCAL_REGION_APP2_NAME); InstanceInfo instanceInfo2 = createInstance(LOCAL_REGION_APP2_NAME, ALL_REGIONS_VIP2_ADDR, LOCAL_REGION_APP2_INSTANCE2_HOSTNAME, null); instanceInfo2.setActionType(InstanceInfo.ActionType.ADDED); myapp2.addInstance(instanceInfo2); return Arrays.asList(myapp1, myapp2); } protected static InstanceInfo createInstance(String appName, String vipAddress, String instanceHostName, String zone) { InstanceInfo.Builder instanceBuilder = InstanceInfo.Builder.newBuilder(); instanceBuilder.setAppName(appName); instanceBuilder.setVIPAddress(vipAddress); instanceBuilder.setHostName(instanceHostName); instanceBuilder.setIPAddr("10.10.101.1"); AmazonInfo amazonInfo = getAmazonInfo(zone, instanceHostName); instanceBuilder.setDataCenterInfo(amazonInfo); instanceBuilder.setMetadata(amazonInfo.getMetadata()); instanceBuilder.setLeaseInfo(LeaseInfo.Builder.newBuilder().build()); return instanceBuilder.build(); } protected static AmazonInfo getAmazonInfo(@Nullable String availabilityZone, String instanceHostName) { AmazonInfo.Builder azBuilder = AmazonInfo.Builder.newBuilder(); azBuilder.addMetadata(AmazonInfo.MetaDataKey.availabilityZone, null == availabilityZone ? "us-east-1a" : availabilityZone); azBuilder.addMetadata(AmazonInfo.MetaDataKey.instanceId, instanceHostName); azBuilder.addMetadata(AmazonInfo.MetaDataKey.amiId, "XXX"); azBuilder.addMetadata(AmazonInfo.MetaDataKey.instanceType, "XXX"); azBuilder.addMetadata(AmazonInfo.MetaDataKey.localIpv4, "XXX"); azBuilder.addMetadata(AmazonInfo.MetaDataKey.publicIpv4, "XXX"); azBuilder.addMetadata(AmazonInfo.MetaDataKey.publicHostname, instanceHostName); return azBuilder.build(); } }