use of com.linkedin.d2.DarkClusterConfig in project rest.li by linkedin.
the class DarkClustersConverter method toProperties.
@SuppressWarnings("unchecked")
public static Map<String, Object> toProperties(DarkClusterConfigMap config) {
if (config == null) {
return Collections.emptyMap();
} else {
Map<String, Object> darkProps = new HashMap<>();
for (Map.Entry<String, DarkClusterConfig> entry : config.entrySet()) {
String darkClusterName = entry.getKey();
DarkClusterConfig darkClusterConfig = entry.getValue();
Map<String, Object> prop = new HashMap<>();
if (darkClusterConfig.hasMultiplier()) {
prop.put(PropertyKeys.DARK_CLUSTER_MULTIPLIER, darkClusterConfig.getMultiplier().toString());
}
if (darkClusterConfig.hasDispatcherOutboundTargetRate()) {
prop.put(PropertyKeys.DARK_CLUSTER_OUTBOUND_TARGET_RATE, darkClusterConfig.getDispatcherOutboundTargetRate().toString());
}
if (darkClusterConfig.hasDispatcherMaxRequestsToBuffer()) {
prop.put(PropertyKeys.DARK_CLUSTER_MAX_REQUESTS_TO_BUFFER, darkClusterConfig.getDispatcherMaxRequestsToBuffer().toString());
}
if (darkClusterConfig.hasDispatcherBufferedRequestExpiryInSeconds()) {
prop.put(PropertyKeys.DARK_CLUSTER_BUFFERED_REQUEST_EXPIRY_IN_SECONDS, darkClusterConfig.getDispatcherBufferedRequestExpiryInSeconds().toString());
}
if (darkClusterConfig.hasDarkClusterStrategyPrioritizedList()) {
DarkClusterStrategyNameArray strategyNameArray = darkClusterConfig.getDarkClusterStrategyPrioritizedList();
List<String> strategyList = new ArrayList<>();
for (DarkClusterStrategyName type : strategyNameArray) {
strategyList.add(type.toString());
}
prop.put(PropertyKeys.DARK_CLUSTER_STRATEGY_LIST, strategyList);
}
if (darkClusterConfig.hasTransportClientProperties()) {
prop.put(PropertyKeys.DARK_CLUSTER_TRANSPORT_CLIENT_PROPERTIES, TransportClientPropertiesConverter.toProperties(darkClusterConfig.getTransportClientProperties()));
}
darkProps.put(darkClusterName, prop);
}
return darkProps;
}
}
use of com.linkedin.d2.DarkClusterConfig in project rest.li by linkedin.
the class DarkClustersConverterTest method testDarkClustersConverter.
@Test(dataProvider = "provideKeys")
public void testDarkClustersConverter(boolean successExpected, DarkClusterConfig darkClusterConfig) {
DarkClusterConfigMap configMap = new DarkClusterConfigMap();
configMap.put(DARK_CLUSTER_KEY, darkClusterConfig);
try {
Assert.assertEquals(DarkClustersConverter.toConfig(DarkClustersConverter.toProperties(configMap)), configMap);
} catch (Exception | AssertionError e) {
if (successExpected) {
Assert.fail("expected success for conversion of: " + darkClusterConfig, e);
}
}
}
use of com.linkedin.d2.DarkClusterConfig in project rest.li by linkedin.
the class DarkClustersConverterTest method testMultipleStrategies.
@Test
public void testMultipleStrategies() {
DarkClusterConfigMap configMap = new DarkClusterConfigMap();
DarkClusterStrategyNameArray darkClusterStrategyNameArray = new DarkClusterStrategyNameArray();
darkClusterStrategyNameArray.add(DarkClusterStrategyName.RELATIVE_TRAFFIC);
darkClusterStrategyNameArray.add(DarkClusterStrategyName.CONSTANT_QPS);
DarkClusterConfig config = new DarkClusterConfig().setDarkClusterStrategyPrioritizedList(darkClusterStrategyNameArray);
configMap.put(DARK_CLUSTER_KEY, config);
// these are defaults that will be set if the fields are missing.
config.setMultiplier(DARK_CLUSTER_DEFAULT_MULTIPLIER);
DarkClusterConfigMap expectedConfigMap = new DarkClusterConfigMap();
DarkClusterConfig expectedConfig = new DarkClusterConfig(config.data());
expectedConfig.setMultiplier(0);
expectedConfig.setDispatcherOutboundTargetRate(0);
expectedConfig.setDispatcherMaxRequestsToBuffer(1);
expectedConfig.setDispatcherBufferedRequestExpiryInSeconds(1);
expectedConfigMap.put(DARK_CLUSTER_KEY, expectedConfig);
DarkClusterConfigMap resultConfigMap = DarkClustersConverter.toConfig(DarkClustersConverter.toProperties(configMap));
Assert.assertEquals(resultConfigMap, expectedConfigMap);
Assert.assertEquals(resultConfigMap.get(DARK_CLUSTER_KEY).getDarkClusterStrategyPrioritizedList().get(0), DarkClusterStrategyName.RELATIVE_TRAFFIC, "expected first strategy to be RELATIVE_TRAFFIC");
Assert.assertEquals(resultConfigMap.get(DARK_CLUSTER_KEY).getDarkClusterStrategyPrioritizedList().get(1), DarkClusterStrategyName.CONSTANT_QPS, "expected first strategy to be CONSTANT_QPS");
}
use of com.linkedin.d2.DarkClusterConfig in project rest.li by linkedin.
the class SimpleLoadBalancerTest method testClusterInfoProviderGetDarkClusters.
@Test
public void testClusterInfoProviderGetDarkClusters() throws InterruptedException, ExecutionException, ServiceUnavailableException {
int numHttp = 3;
int numHttps = 4;
int partitionIdForAdd = 0;
MockStore<ServiceProperties> serviceRegistry = new MockStore<>();
MockStore<ClusterProperties> clusterRegistry = new MockStore<>();
MockStore<UriProperties> uriRegistry = new MockStore<>();
SimpleLoadBalancer loadBalancer = setupLoadBalancer(null, serviceRegistry, clusterRegistry, uriRegistry);
DarkClusterConfig darkClusterConfig = new DarkClusterConfig().setMultiplier(1.0f).setDispatcherOutboundTargetRate(1).setDispatcherMaxRequestsToBuffer(1).setDispatcherBufferedRequestExpiryInSeconds(1);
DarkClusterConfigMap darkClusterConfigMap = new DarkClusterConfigMap();
darkClusterConfigMap.put(DARK_CLUSTER1_NAME, darkClusterConfig);
clusterRegistry.put(CLUSTER1_NAME, new ClusterProperties(CLUSTER1_NAME, Collections.emptyList(), Collections.emptyMap(), Collections.emptySet(), NullPartitionProperties.getInstance(), Collections.emptyList(), DarkClustersConverter.toProperties(darkClusterConfigMap), false));
populateUriRegistry(numHttp, numHttps, partitionIdForAdd, uriRegistry);
loadBalancer.getDarkClusterConfigMap(CLUSTER1_NAME, new Callback<DarkClusterConfigMap>() {
@Override
public void onError(Throwable e) {
Assert.fail("getDarkClusterConfigMap threw exception", e);
}
@Override
public void onSuccess(DarkClusterConfigMap returnedDarkClusterConfigMap) {
Assert.assertEquals(returnedDarkClusterConfigMap, darkClusterConfigMap, "dark cluster configs should be equal");
Assert.assertEquals(returnedDarkClusterConfigMap.get(DARK_CLUSTER1_NAME).getMultiplier(), 1.0f, "multiplier should match");
}
});
}
use of com.linkedin.d2.DarkClusterConfig in project rest.li by linkedin.
the class TestDarkClusterStrategyFactory method testStrategyFallThruWithNoFallback.
@Test
public void testStrategyFallThruWithNoFallback() {
DarkClusterConfig darkClusterConfig1 = createRelativeTrafficMultiplierConfig(0.5f);
DarkClusterStrategyNameArray darkClusterStrategyList = new DarkClusterStrategyNameArray();
// Only ConstantQPS strategy is present, with no alternative.
darkClusterStrategyList.addAll(Collections.singletonList(CONSTANT_QPS));
darkClusterConfig1.setDarkClusterStrategyPrioritizedList(darkClusterStrategyList);
_clusterInfoProvider.addDarkClusterConfig(SOURCE_CLUSTER_NAME, DARK_CLUSTER_NAME, darkClusterConfig1);
_clusterInfoProvider.notifyListenersClusterAdded(SOURCE_CLUSTER_NAME);
DarkClusterStrategy strategy = _strategyFactory.get(DARK_CLUSTER_NAME);
// test that we didn't find a strategy corresponding to Constant QPS and fell through. It will end up with the NoOpStrategy.
Assert.assertTrue(strategy instanceof NoOpDarkClusterStrategy);
}
Aggregations