package com.netflix.suro.client;
import java.util.Map;
import javax.inject.Inject;
import com.google.inject.Provider;
import com.netflix.governator.guice.lazy.LazySingleton;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.suro.ClientConfig;
/**
* Configuration based {@link ILoadBalancer} provider that will create an {@link ILoadBalancer}
* implementation based on the value of {@link ClienConfig.getLoadBalancerType()}.
*
* To add a new ILoadBalancer type implementation see {@link SuroClientModule}
*
* @author elandau
*
*/
@LazySingleton
public class ConfigBasedLoadBalancerProvider implements Provider<ILoadBalancer> {
private final Provider<ClientConfig> config;
private final Map<String, Provider<ILoadBalancer>> impls;
private static final String DEFAULT_LOAD_BALANCER_TYPE = "static";
@Inject
public ConfigBasedLoadBalancerProvider(Provider<ClientConfig> configProvider, Map<String, Provider<ILoadBalancer>> impls) {
this.config = configProvider;
this.impls = impls;
}
@Override
public ILoadBalancer get() {
// Load the singleton ClientConfig lazily
ClientConfig config = this.config.get();
if (config.getLoadBalancerType() != null) {
if (!impls.containsKey(config.getLoadBalancerType())) {
throw new RuntimeException(
String.format("Unknown load balancer type '%s'. Expecting one of %s",
config.getLoadBalancerType(),
impls.keySet()));
}
return impls.get(config.getLoadBalancerType()).get();
}
else {
return impls.get(DEFAULT_LOAD_BALANCER_TYPE).get();
}
}
}