下面列出了怎么用io.grpc.LoadBalancerRegistry的API类实例代码及写法,或者点击链接到github查看源代码。
/**
* Creates the NameResolver instance.
*
* @param authority The authority string used to create the URI.
* @param bootstrapServers The initial set of controller endpoints.
* @param enableDiscovery Whether to use the controller's discovery API.
* @param executor The executor to run resolve tasks on.
*/
ControllerNameResolver(final String authority, final List<InetSocketAddress> bootstrapServers,
final boolean enableDiscovery, ScheduledExecutorService executor) {
this.authority = authority;
this.bootstrapServers = ImmutableList.copyOf(bootstrapServers);
this.enableDiscovery = enableDiscovery;
if (this.enableDiscovery) {
// We will use the direct scheme to send the discovery RPC request to the controller bootstrap servers.
String connectString = "tcp://";
final List<String> strings = this.bootstrapServers.stream()
.map(server -> server.getHostString() + ":" + server.getPort())
.collect(Collectors.toList());
connectString = connectString + String.join(",", strings);
this.client = ControllerServiceGrpc.newBlockingStub(ManagedChannelBuilder
.forTarget(connectString)
.nameResolverFactory(new ControllerResolverFactory(executor))
.loadBalancerFactory(LoadBalancerRegistry.getDefaultRegistry().getProvider("round_robin"))
.usePlaintext()
.build());
} else {
this.client = null;
}
this.scheduledExecutor = executor;
}
@VisibleForTesting
LocalityStoreImpl(
InternalLogId logId,
Helper helper,
LoadBalancerRegistry lbRegistry,
ThreadSafeRandom random,
LoadStatsStore loadStatsStore,
OrcaPerRequestUtil orcaPerRequestUtil,
OrcaOobUtil orcaOobUtil) {
this.helper = checkNotNull(helper, "helper");
loadBalancerProvider = checkNotNull(
lbRegistry.getProvider(ROUND_ROBIN),
"Unable to find '%s' LoadBalancer", ROUND_ROBIN);
this.random = checkNotNull(random, "random");
this.loadStatsStore = checkNotNull(loadStatsStore, "loadStatsStore");
this.orcaPerRequestUtil = checkNotNull(orcaPerRequestUtil, "orcaPerRequestUtil");
this.orcaOobUtil = checkNotNull(orcaOobUtil, "orcaOobUtil");
logger = XdsLogger.withLogId(checkNotNull(logId, "logId"));
}
@VisibleForTesting
EdsLoadBalancer(
Helper helper,
LoadBalancerRegistry lbRegistry,
LocalityStoreFactory localityStoreFactory,
Bootstrapper bootstrapper,
XdsChannelFactory channelFactory) {
this.helper = checkNotNull(helper, "helper");
this.lbRegistry = checkNotNull(lbRegistry, "lbRegistry");
this.localityStoreFactory = checkNotNull(localityStoreFactory, "localityStoreFactory");
this.bootstrapper = checkNotNull(bootstrapper, "bootstrapper");
this.channelFactory = checkNotNull(channelFactory, "channelFactory");
this.switchingLoadBalancer = new GracefulSwitchLoadBalancer(helper);
logId = InternalLogId.allocate("eds-lb", helper.getAuthority());
logger = XdsLogger.withLogId(logId);
logger.log(XdsLogLevel.INFO, "Created");
}
@Test
public void childLoadBalancingPolicy_noPolicyProvided() {
LoadBalancerProvider mockProvider = mock(LoadBalancerProvider.class);
when(mockProvider.getPolicyName()).thenReturn("rls");
when(mockProvider.isAvailable()).thenReturn(true);
LoadBalancerRegistry.getDefaultRegistry().register(mockProvider);
try {
ChildLoadBalancingPolicy.create(
"targetFieldName",
ImmutableList.<Map<String, ?>>of(
ImmutableMap.<String, Object>of(
"rls", ImmutableMap.of(), "rls2", ImmutableMap.of())));
fail("parsing exception expected");
} catch (InvalidChildPolicyConfigException e) {
assertThat(e).hasMessageThat()
.contains("childPolicy should have exactly one loadbalancing policy");
} finally {
LoadBalancerRegistry.getDefaultRegistry().deregister(mockProvider);
}
}
@Before
public void setUp() throws Exception {
when(mockLoadBalancer.canHandleEmptyAddressListFromNameResolution()).thenCallRealMethod();
LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider);
expectedUri = new URI(TARGET);
transports = TestUtils.captureTransports(mockTransportFactory);
when(mockTransportFactory.getScheduledExecutorService())
.thenReturn(timer.getScheduledExecutorService());
when(executorPool.getObject()).thenReturn(executor.getScheduledExecutorService());
when(balancerRpcExecutorPool.getObject())
.thenReturn(balancerRpcExecutor.getScheduledExecutorService());
channelBuilder =
new ChannelBuilder()
.nameResolverFactory(new FakeNameResolverFactory.Builder(expectedUri).build())
.defaultLoadBalancingPolicy(MOCK_POLICY_NAME)
.userAgent(USER_AGENT)
.idleTimeout(
AbstractManagedChannelImplBuilder.IDLE_MODE_MAX_TIMEOUT_DAYS, TimeUnit.DAYS)
.offloadExecutor(offloadExecutor);
channelBuilder.executorPool = executorPool;
channelBuilder.binlog = null;
channelBuilder.channelz = channelz;
}
@Test
public void enableServiceConfigLookUp_resolverReturnsNoConfig_noDefaultConfig() {
LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider);
try {
FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri)
.setServers(ImmutableList.of(addressGroup)).build();
channelBuilder.nameResolverFactory(nameResolverFactory);
Map<String, Object> rawServiceConfig = Collections.emptyMap();
ManagedChannelServiceConfig managedChannelServiceConfig =
createManagedChannelServiceConfig(rawServiceConfig, null);
nameResolverFactory.nextConfigOrError.set(
ConfigOrError.fromConfig(managedChannelServiceConfig));
createChannel();
ArgumentCaptor<ResolvedAddresses> resultCaptor =
ArgumentCaptor.forClass(ResolvedAddresses.class);
verify(mockLoadBalancer).handleResolvedAddresses(resultCaptor.capture());
assertThat(resultCaptor.getValue().getAddresses()).containsExactly(addressGroup);
verify(mockLoadBalancer, never()).handleNameResolutionError(any(Status.class));
} finally {
LoadBalancerRegistry.getDefaultRegistry().deregister(mockLoadBalancerProvider);
}
}
@Before
public void setUp() throws Exception {
when(mockLoadBalancer.canHandleEmptyAddressListFromNameResolution()).thenCallRealMethod();
LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider);
expectedUri = new URI(TARGET);
when(mockTransportFactory.getScheduledExecutorService())
.thenReturn(timer.getScheduledExecutorService());
when(executorPool.getObject()).thenReturn(executor.getScheduledExecutorService());
channelBuilder =
new ChannelBuilder()
.nameResolverFactory(new FakeNameResolverFactory.Builder(expectedUri).build())
.defaultLoadBalancingPolicy(MOCK_POLICY_NAME)
.userAgent(USER_AGENT)
.idleTimeout(
AbstractManagedChannelImplBuilder.IDLE_MODE_MAX_TIMEOUT_DAYS, TimeUnit.DAYS)
.offloadExecutor(blockingExecutor);
channelBuilder.executorPool = executorPool;
channelBuilder.binlog = null;
channelBuilder.channelz = channelz;
}
@Test
public void registry() {
LoadBalancerProvider hcRoundRobin =
LoadBalancerRegistry.getDefaultRegistry().getProvider("round_robin");
assertThat(hcRoundRobin).isInstanceOf(
HealthCheckingRoundRobinLoadBalancerProvider.class);
}
/**
* Creates a new instance of the Controller client class.
*
* @param config The configuration for this client implementation.
* @param executor The executor service to be used for handling retries.
*/
public ControllerImpl(final ControllerImplConfig config,
final ScheduledExecutorService executor) {
this(NettyChannelBuilder.forTarget(config.getClientConfig().getControllerURI().toString())
.nameResolverFactory(new ControllerResolverFactory(executor))
.loadBalancerFactory(LoadBalancerRegistry.getDefaultRegistry().getProvider("round_robin"))
.keepAliveTime(DEFAULT_KEEPALIVE_TIME_MINUTES, TimeUnit.MINUTES),
config, executor);
log.info("Controller client connecting to server at {}", config.getClientConfig().getControllerURI().getAuthority());
}
@Activate
public void activate() {
componentConfigService.registerProperties(getClass());
channels = new ConcurrentHashMap<>();
interceptors = new ConcurrentHashMap<>();
LoadBalancerRegistry.getDefaultRegistry()
.register(PICK_FIRST_LOAD_BALANCER_PROVIDER);
NameResolverRegistry.getDefaultRegistry()
.register(DNS_NAME_RESOLVER_PROVIDER);
log.info("Started");
}
@Deactivate
public void deactivate() {
LoadBalancerRegistry.getDefaultRegistry()
.deregister(PICK_FIRST_LOAD_BALANCER_PROVIDER);
NameResolverRegistry.getDefaultRegistry()
.register(DNS_NAME_RESOLVER_PROVIDER);
componentConfigService.unregisterProperties(getClass(), false);
channels.values().forEach(ManagedChannel::shutdownNow);
channels.clear();
channels = null;
interceptors.values().forEach(GrpcLoggingInterceptor::close);
interceptors.clear();
interceptors = null;
log.info("Stopped");
}
@Override
public ConfigOrError parseLoadBalancingPolicyConfig(
Map<String, ?> rawLoadBalancingPolicyConfig) {
LoadBalancerRegistry registry = LoadBalancerRegistry.getDefaultRegistry();
try {
String cluster = JsonUtil.getString(rawLoadBalancingPolicyConfig, "cluster");
if (cluster == null) {
return ConfigOrError.fromError(Status.INTERNAL.withDescription("Cluster name required"));
}
String edsServiceName = JsonUtil.getString(rawLoadBalancingPolicyConfig, "edsServiceName");
String lrsServerName =
JsonUtil.getString(rawLoadBalancingPolicyConfig, "lrsLoadReportingServerName");
// TODO(chengyuanzhang): figure out locality_picking_policy parsing and its default value.
LbConfig roundRobinConfig = new LbConfig("round_robin", ImmutableMap.<String, Object>of());
List<LbConfig> endpointPickingPolicy =
ServiceConfigUtil
.unwrapLoadBalancingConfigList(
JsonUtil.getListOfObjects(
rawLoadBalancingPolicyConfig, "endpointPickingPolicy"));
if (endpointPickingPolicy == null || endpointPickingPolicy.isEmpty()) {
endpointPickingPolicy = Collections.singletonList(roundRobinConfig);
}
ConfigOrError endpointPickingConfigOrError =
ServiceConfigUtil.selectLbPolicyFromList(endpointPickingPolicy, registry);
if (endpointPickingConfigOrError.getError() != null) {
return endpointPickingConfigOrError;
}
PolicySelection endpointPickingSelection =
(PolicySelection) endpointPickingConfigOrError.getConfig();
return ConfigOrError.fromConfig(
new EdsConfig(cluster, edsServiceName, lrsServerName, endpointPickingSelection));
} catch (RuntimeException e) {
return ConfigOrError.fromError(
Status.fromThrowable(e).withDescription(
"Failed to parse EDS LB config: " + rawLoadBalancingPolicyConfig));
}
}
private static PolicySelection parseAction(
Map<String, ?> rawAction, LoadBalancerRegistry registry) {
List<LbConfig> childConfigCandidates = ServiceConfigUtil.unwrapLoadBalancingConfigList(
JsonUtil.getListOfObjects(rawAction, "childPolicy"));
if (childConfigCandidates == null || childConfigCandidates.isEmpty()) {
throw new RuntimeException("childPolicy not specified");
}
ConfigOrError selectedConfigOrError =
ServiceConfigUtil.selectLbPolicyFromList(childConfigCandidates, registry);
if (selectedConfigOrError.getError() != null) {
throw selectedConfigOrError.getError().asRuntimeException();
}
return (PolicySelection) selectedConfigOrError.getConfig();
}
@Override
LocalityStore newLocalityStore(
InternalLogId logId,
Helper helper,
LoadBalancerRegistry lbRegistry,
LoadStatsStore loadStatsStore) {
return new LocalityStoreImpl(logId, helper, lbRegistry, loadStatsStore);
}
LocalityStoreImpl(
InternalLogId logId,
Helper helper,
LoadBalancerRegistry lbRegistry,
LoadStatsStore loadStatsStore) {
this(
logId,
helper,
lbRegistry,
ThreadSafeRandom.ThreadSafeRandomImpl.instance,
loadStatsStore,
OrcaPerRequestUtil.getInstance(),
OrcaOobUtil.getInstance());
}
EdsLoadBalancer(Helper helper) {
this(
helper,
LoadBalancerRegistry.getDefaultRegistry(),
LocalityStoreFactory.getInstance(),
Bootstrapper.getInstance(),
XdsChannelFactory.getInstance());
}
@VisibleForTesting
CdsLoadBalancer(Helper helper, LoadBalancerRegistry lbRegistry,
TlsContextManager tlsContextManager) {
checkNotNull(helper, "helper");
this.lbRegistry = lbRegistry;
this.switchingLoadBalancer = new GracefulSwitchLoadBalancer(helper);
this.tlsContextManager = tlsContextManager;
logger = XdsLogger.withLogId(InternalLogId.allocate("cds-lb", helper.getAuthority()));
logger.log(XdsLogLevel.INFO, "Created");
}
/** Creates ChildLoadBalancingPolicy. */
@SuppressWarnings("unchecked")
static ChildLoadBalancingPolicy create(
String childPolicyConfigTargetFieldName, List<Map<String, ?>> childPolicies)
throws InvalidChildPolicyConfigException {
Map<String, Object> effectiveChildPolicy = null;
LoadBalancerProvider effectiveLbProvider = null;
List<String> policyTried = new ArrayList<>();
LoadBalancerRegistry lbRegistry = LoadBalancerRegistry.getDefaultRegistry();
for (Map<String, ?> childPolicy : childPolicies) {
if (childPolicy.isEmpty()) {
continue;
}
if (childPolicy.size() != 1) {
throw
new InvalidChildPolicyConfigException(
"childPolicy should have exactly one loadbalancing policy");
}
String policyName = childPolicy.keySet().iterator().next();
LoadBalancerProvider provider = lbRegistry.getProvider(policyName);
if (provider != null) {
effectiveLbProvider = provider;
effectiveChildPolicy = Collections.unmodifiableMap(childPolicy);
break;
}
policyTried.add(policyName);
}
if (effectiveChildPolicy == null) {
throw
new InvalidChildPolicyConfigException(
String.format("no valid childPolicy found, policy tried: %s", policyTried));
}
return
new ChildLoadBalancingPolicy(
childPolicyConfigTargetFieldName,
(Map<String, Object>) effectiveChildPolicy.values().iterator().next(),
effectiveLbProvider);
}
@Test
public void registry() {
LoadBalancerProvider hcRoundRobin =
LoadBalancerRegistry.getDefaultRegistry().getProvider("round_robin");
assertThat(hcRoundRobin).isInstanceOf(
HealthCheckingRoundRobinLoadBalancerProvider.class);
}
/**
* Parses and selects a load balancing policy from a non-empty list of raw configs. If selection
* is successful, the returned ConfigOrError object will include a {@link
* ServiceConfigUtil.PolicySelection} as its config value.
*/
public static ConfigOrError selectLbPolicyFromList(
List<LbConfig> lbConfigs, LoadBalancerRegistry lbRegistry) {
List<String> policiesTried = new ArrayList<>();
for (LbConfig lbConfig : lbConfigs) {
String policy = lbConfig.getPolicyName();
LoadBalancerProvider provider = lbRegistry.getProvider(policy);
if (provider == null) {
policiesTried.add(policy);
} else {
if (!policiesTried.isEmpty()) {
Logger.getLogger(ServiceConfigUtil.class.getName()).log(
Level.FINEST,
"{0} specified by Service Config are not available", policiesTried);
}
ConfigOrError parsedLbPolicyConfig =
provider.parseLoadBalancingPolicyConfig(lbConfig.getRawConfigValue());
if (parsedLbPolicyConfig.getError() != null) {
return parsedLbPolicyConfig;
}
return ConfigOrError.fromConfig(new PolicySelection(
provider, lbConfig.rawConfigValue, parsedLbPolicyConfig.getConfig()));
}
}
return ConfigOrError.fromError(
Status.UNKNOWN.withDescription(
"None of " + policiesTried + " specified by Service Config are available."));
}
@Test
public void disableServiceConfigLookUp_noDefaultConfig() throws Exception {
LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider);
try {
FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri)
.setServers(ImmutableList.of(addressGroup)).build();
channelBuilder.nameResolverFactory(nameResolverFactory);
channelBuilder.disableServiceConfigLookUp();
Map<String, Object> rawServiceConfig =
parseConfig("{\"methodConfig\":[{"
+ "\"name\":[{\"service\":\"SimpleService1\"}],"
+ "\"waitForReady\":true}]}");
ManagedChannelServiceConfig managedChannelServiceConfig =
createManagedChannelServiceConfig(rawServiceConfig, null);
nameResolverFactory.nextConfigOrError.set(
ConfigOrError.fromConfig(managedChannelServiceConfig));
createChannel();
ArgumentCaptor<ResolvedAddresses> resultCaptor =
ArgumentCaptor.forClass(ResolvedAddresses.class);
verify(mockLoadBalancer).handleResolvedAddresses(resultCaptor.capture());
assertThat(resultCaptor.getValue().getAddresses()).containsExactly(addressGroup);
verify(mockLoadBalancer, never()).handleNameResolutionError(any(Status.class));
} finally {
LoadBalancerRegistry.getDefaultRegistry().deregister(mockLoadBalancerProvider);
}
}
@Test
public void disableServiceConfigLookUp_withDefaultConfig() throws Exception {
LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider);
try {
FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri)
.setServers(ImmutableList.of(addressGroup)).build();
channelBuilder.nameResolverFactory(nameResolverFactory);
channelBuilder.disableServiceConfigLookUp();
Map<String, Object> defaultServiceConfig =
parseConfig("{\"methodConfig\":[{"
+ "\"name\":[{\"service\":\"SimpleService1\"}],"
+ "\"waitForReady\":true}]}");
channelBuilder.defaultServiceConfig(defaultServiceConfig);
Map<String, Object> rawServiceConfig = new HashMap<>();
ManagedChannelServiceConfig managedChannelServiceConfig =
createManagedChannelServiceConfig(rawServiceConfig, null);
nameResolverFactory.nextConfigOrError.set(
ConfigOrError.fromConfig(managedChannelServiceConfig));
createChannel();
ArgumentCaptor<ResolvedAddresses> resultCaptor =
ArgumentCaptor.forClass(ResolvedAddresses.class);
verify(mockLoadBalancer).handleResolvedAddresses(resultCaptor.capture());
assertThat(resultCaptor.getValue().getAddresses()).containsExactly(addressGroup);
verify(mockLoadBalancer, never()).handleNameResolutionError(any(Status.class));
} finally {
LoadBalancerRegistry.getDefaultRegistry().deregister(mockLoadBalancerProvider);
}
}
@Test
public void enableServiceConfigLookUp_withDefaultConfig() throws Exception {
LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider);
try {
FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri)
.setServers(ImmutableList.of(addressGroup)).build();
channelBuilder.nameResolverFactory(nameResolverFactory);
Map<String, Object> defaultServiceConfig =
parseConfig("{\"methodConfig\":[{"
+ "\"name\":[{\"service\":\"SimpleService1\"}],"
+ "\"waitForReady\":true}]}");
channelBuilder.defaultServiceConfig(defaultServiceConfig);
Map<String, Object> rawServiceConfig =
parseConfig("{\"methodConfig\":[{"
+ "\"name\":[{\"service\":\"SimpleService2\"}],"
+ "\"waitForReady\":false}]}");
ManagedChannelServiceConfig managedChannelServiceConfig =
createManagedChannelServiceConfig(rawServiceConfig, null);
nameResolverFactory.nextConfigOrError.set(
ConfigOrError.fromConfig(managedChannelServiceConfig));
createChannel();
ArgumentCaptor<ResolvedAddresses> resultCaptor =
ArgumentCaptor.forClass(ResolvedAddresses.class);
verify(mockLoadBalancer).handleResolvedAddresses(resultCaptor.capture());
assertThat(resultCaptor.getValue().getAddresses()).containsExactly(addressGroup);
verify(mockLoadBalancer, never()).handleNameResolutionError(any(Status.class));
} finally {
LoadBalancerRegistry.getDefaultRegistry().deregister(mockLoadBalancerProvider);
}
}
@Test
public void enableServiceConfigLookUp_resolverReturnsNoConfig_withDefaultConfig()
throws Exception {
LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider);
try {
FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri)
.setServers(ImmutableList.of(addressGroup)).build();
channelBuilder.nameResolverFactory(nameResolverFactory);
Map<String, Object> defaultServiceConfig =
parseConfig("{\"methodConfig\":[{"
+ "\"name\":[{\"service\":\"SimpleService1\"}],"
+ "\"waitForReady\":true}]}");
channelBuilder.defaultServiceConfig(defaultServiceConfig);
nameResolverFactory.nextConfigOrError.set(null);
createChannel();
ArgumentCaptor<ResolvedAddresses> resultCaptor =
ArgumentCaptor.forClass(ResolvedAddresses.class);
verify(mockLoadBalancer).handleResolvedAddresses(resultCaptor.capture());
assertThat(resultCaptor.getValue().getAddresses()).containsExactly(addressGroup);
verify(mockLoadBalancer, never()).handleNameResolutionError(any(Status.class));
} finally {
LoadBalancerRegistry.getDefaultRegistry().deregister(mockLoadBalancerProvider);
}
}
@Test
public void healthCheckingConfigPropagated() throws Exception {
LoadBalancerRegistry.getDefaultRegistry().register(mockLoadBalancerProvider);
try {
FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.build();
channelBuilder.nameResolverFactory(nameResolverFactory);
Map<String, Object> rawServiceConfig =
parseConfig("{\"healthCheckConfig\": {\"serviceName\": \"service1\"}}");
ManagedChannelServiceConfig managedChannelServiceConfig =
createManagedChannelServiceConfig(rawServiceConfig, null);
nameResolverFactory.nextConfigOrError.set(
ConfigOrError.fromConfig(managedChannelServiceConfig));
createChannel();
ArgumentCaptor<ResolvedAddresses> resultCaptor =
ArgumentCaptor.forClass(ResolvedAddresses.class);
verify(mockLoadBalancer).handleResolvedAddresses(resultCaptor.capture());
assertThat(resultCaptor.getValue().getAttributes()
.get(LoadBalancer.ATTR_HEALTH_CHECKING_CONFIG))
.containsExactly("serviceName", "service1");
} finally {
LoadBalancerRegistry.getDefaultRegistry().deregister(mockLoadBalancerProvider);
}
}
private GrpclbLoadBalancerFactory() {
provider = checkNotNull(
LoadBalancerRegistry.getDefaultRegistry().getProvider("grpclb"),
"grpclb balancer not available");
}
private RoundRobinLoadBalancerFactory() {
provider = checkNotNull(
LoadBalancerRegistry.getDefaultRegistry().getProvider("round_robin"),
"round_robin balancer not available");
}
@VisibleForTesting
XdsRoutingLoadBalancerProvider(@Nullable LoadBalancerRegistry lbRegistry) {
this.lbRegistry = lbRegistry;
}
@Override
public ConfigOrError parseLoadBalancingPolicyConfig(Map<String, ?> rawConfig) {
try {
Map<String, ?> actions = JsonUtil.getObject(rawConfig, "action");
if (actions == null || actions.isEmpty()) {
return ConfigOrError.fromError(Status.INTERNAL.withDescription(
"No actions provided for xds_routing LB policy: " + rawConfig));
}
Map<String, PolicySelection> parsedActions = new LinkedHashMap<>();
for (String name : actions.keySet()) {
Map<String, ?> rawAction = JsonUtil.getObject(actions, name);
if (rawAction == null) {
return ConfigOrError.fromError(Status.INTERNAL.withDescription(
"No config for action " + name + " in xds_routing LB policy: " + rawConfig));
}
PolicySelection parsedAction =
parseAction(
rawAction,
this.lbRegistry == null
? LoadBalancerRegistry.getDefaultRegistry() : this.lbRegistry);
parsedActions.put(name, parsedAction);
}
List<Route> parsedRoutes = new ArrayList<>();
List<Map<String, ?>> rawRoutes = JsonUtil.getListOfObjects(rawConfig, "route");
if (rawRoutes == null || rawRoutes.isEmpty()) {
return ConfigOrError.fromError(Status.INTERNAL.withDescription(
"No routes provided for xds_routing LB policy: " + rawConfig));
}
for (Map<String, ?> rawRoute: rawRoutes) {
Route route = parseRoute(rawRoute);
if (!parsedActions.containsKey(route.getActionName())) {
return ConfigOrError.fromError(Status.INTERNAL.withDescription(
"No action defined for route " + route + " in xds_routing LB policy: " + rawConfig));
}
parsedRoutes.add(route);
}
return ConfigOrError.fromConfig(new XdsRoutingConfig(parsedRoutes, parsedActions));
} catch (RuntimeException e) {
return ConfigOrError.fromError(
Status.fromThrowable(e).withDescription(
"Failed to parse xds_routing LB config: " + rawConfig));
}
}
abstract LocalityStore newLocalityStore(
InternalLogId logId,
Helper helper,
LoadBalancerRegistry lbRegistry,
LoadStatsStore loadStatsStore);