xds: remove environmental variables (#10055)

This commit is contained in:
yifeizhuang 2023-04-19 17:26:26 -07:00 committed by GitHub
parent ebc84c209f
commit 8b9ae27cdf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 176 additions and 253 deletions

View File

@ -92,11 +92,11 @@ class LoadBalancerConfigFactory {
* @throws ResourceInvalidException If the {@link Cluster} has an invalid LB configuration. * @throws ResourceInvalidException If the {@link Cluster} has an invalid LB configuration.
*/ */
static ImmutableMap<String, ?> newConfig(Cluster cluster, boolean enableLeastRequest, static ImmutableMap<String, ?> newConfig(Cluster cluster, boolean enableLeastRequest,
boolean enableCustomLbConfig, boolean enableWrr) boolean enableWrr)
throws ResourceInvalidException { throws ResourceInvalidException {
// The new load_balancing_policy will always be used if it is set, but for backward // The new load_balancing_policy will always be used if it is set, but for backward
// compatibility we will fall back to using the old lb_policy field if the new field is not set. // compatibility we will fall back to using the old lb_policy field if the new field is not set.
if (cluster.hasLoadBalancingPolicy() && enableCustomLbConfig) { if (cluster.hasLoadBalancingPolicy()) {
try { try {
return LoadBalancingPolicyConverter.convertToServiceConfig(cluster.getLoadBalancingPolicy(), return LoadBalancingPolicyConverter.convertToServiceConfig(cluster.getLoadBalancingPolicy(),
0, enableWrr); 0, enableWrr);

View File

@ -133,7 +133,7 @@ class XdsClusterResource extends XdsResourceType<CdsUpdate> {
CdsUpdate.Builder updateBuilder = structOrError.getStruct(); CdsUpdate.Builder updateBuilder = structOrError.getStruct();
ImmutableMap<String, ?> lbPolicyConfig = LoadBalancerConfigFactory.newConfig(cluster, ImmutableMap<String, ?> lbPolicyConfig = LoadBalancerConfigFactory.newConfig(cluster,
enableLeastRequest, enableCustomLbConfig, enableWrr); enableLeastRequest, enableWrr);
// Validate the LB config by trying to parse it with the corresponding LB provider. // Validate the LB config by trying to parse it with the corresponding LB provider.
LbConfig lbConfig = ServiceConfigUtil.unwrapLoadBalancingConfig(lbPolicyConfig); LbConfig lbConfig = ServiceConfigUtil.unwrapLoadBalancingConfig(lbPolicyConfig);
@ -216,7 +216,7 @@ class XdsClusterResource extends XdsResourceType<CdsUpdate> {
} }
} }
if (cluster.hasOutlierDetection() && enableOutlierDetection) { if (cluster.hasOutlierDetection()) {
try { try {
outlierDetection = OutlierDetection.fromEnvoyOutlierDetection( outlierDetection = OutlierDetection.fromEnvoyOutlierDetection(
validateOutlierDetection(cluster.getOutlierDetection())); validateOutlierDetection(cluster.getOutlierDetection()));

View File

@ -103,14 +103,14 @@ class XdsListenerResource extends XdsResourceType<LdsUpdate> {
if (listener.hasApiListener()) { if (listener.hasApiListener()) {
return processClientSideListener( return processClientSideListener(
listener, args, enableFaultInjection); listener, args);
} else { } else {
return processServerSideListener( return processServerSideListener(
listener, args, enableRbac); listener, args);
} }
} }
private LdsUpdate processClientSideListener(Listener listener, Args args, boolean parseHttpFilter) private LdsUpdate processClientSideListener(Listener listener, Args args)
throws ResourceInvalidException { throws ResourceInvalidException {
// Unpack HttpConnectionManager from the Listener. // Unpack HttpConnectionManager from the Listener.
HttpConnectionManager hcm; HttpConnectionManager hcm;
@ -123,23 +123,23 @@ class XdsListenerResource extends XdsResourceType<LdsUpdate> {
"Could not parse HttpConnectionManager config from ApiListener", e); "Could not parse HttpConnectionManager config from ApiListener", e);
} }
return LdsUpdate.forApiListener(parseHttpConnectionManager( return LdsUpdate.forApiListener(parseHttpConnectionManager(
hcm, args.filterRegistry, parseHttpFilter, true /* isForClient */)); hcm, args.filterRegistry, true /* isForClient */));
} }
private LdsUpdate processServerSideListener(Listener proto, Args args, boolean parseHttpFilter) private LdsUpdate processServerSideListener(Listener proto, Args args)
throws ResourceInvalidException { throws ResourceInvalidException {
Set<String> certProviderInstances = null; Set<String> certProviderInstances = null;
if (args.bootstrapInfo != null && args.bootstrapInfo.certProviders() != null) { if (args.bootstrapInfo != null && args.bootstrapInfo.certProviders() != null) {
certProviderInstances = args.bootstrapInfo.certProviders().keySet(); certProviderInstances = args.bootstrapInfo.certProviders().keySet();
} }
return LdsUpdate.forTcpListener(parseServerSideListener(proto, args.tlsContextManager, return LdsUpdate.forTcpListener(parseServerSideListener(proto, args.tlsContextManager,
args.filterRegistry, certProviderInstances, parseHttpFilter)); args.filterRegistry, certProviderInstances));
} }
@VisibleForTesting @VisibleForTesting
static EnvoyServerProtoData.Listener parseServerSideListener( static EnvoyServerProtoData.Listener parseServerSideListener(
Listener proto, TlsContextManager tlsContextManager, Listener proto, TlsContextManager tlsContextManager,
FilterRegistry filterRegistry, Set<String> certProviderInstances, boolean parseHttpFilter) FilterRegistry filterRegistry, Set<String> certProviderInstances)
throws ResourceInvalidException { throws ResourceInvalidException {
if (!proto.getTrafficDirection().equals(TrafficDirection.INBOUND) if (!proto.getTrafficDirection().equals(TrafficDirection.INBOUND)
&& !proto.getTrafficDirection().equals(TrafficDirection.UNSPECIFIED)) { && !proto.getTrafficDirection().equals(TrafficDirection.UNSPECIFIED)) {
@ -177,13 +177,13 @@ class XdsListenerResource extends XdsResourceType<LdsUpdate> {
for (io.envoyproxy.envoy.config.listener.v3.FilterChain fc : proto.getFilterChainsList()) { for (io.envoyproxy.envoy.config.listener.v3.FilterChain fc : proto.getFilterChainsList()) {
filterChains.add( filterChains.add(
parseFilterChain(fc, tlsContextManager, filterRegistry, uniqueSet, parseFilterChain(fc, tlsContextManager, filterRegistry, uniqueSet,
certProviderInstances, parseHttpFilter)); certProviderInstances));
} }
FilterChain defaultFilterChain = null; FilterChain defaultFilterChain = null;
if (proto.hasDefaultFilterChain()) { if (proto.hasDefaultFilterChain()) {
defaultFilterChain = parseFilterChain( defaultFilterChain = parseFilterChain(
proto.getDefaultFilterChain(), tlsContextManager, filterRegistry, proto.getDefaultFilterChain(), tlsContextManager, filterRegistry,
null, certProviderInstances, parseHttpFilter); null, certProviderInstances);
} }
return EnvoyServerProtoData.Listener.create( return EnvoyServerProtoData.Listener.create(
@ -194,7 +194,7 @@ class XdsListenerResource extends XdsResourceType<LdsUpdate> {
static FilterChain parseFilterChain( static FilterChain parseFilterChain(
io.envoyproxy.envoy.config.listener.v3.FilterChain proto, io.envoyproxy.envoy.config.listener.v3.FilterChain proto,
TlsContextManager tlsContextManager, FilterRegistry filterRegistry, TlsContextManager tlsContextManager, FilterRegistry filterRegistry,
Set<FilterChainMatch> uniqueSet, Set<String> certProviderInstances, boolean parseHttpFilters) Set<FilterChainMatch> uniqueSet, Set<String> certProviderInstances)
throws ResourceInvalidException { throws ResourceInvalidException {
if (proto.getFiltersCount() != 1) { if (proto.getFiltersCount() != 1) {
throw new ResourceInvalidException("FilterChain " + proto.getName() throw new ResourceInvalidException("FilterChain " + proto.getName()
@ -221,7 +221,7 @@ class XdsListenerResource extends XdsResourceType<LdsUpdate> {
+ filter.getName() + " failed to unpack message", e); + filter.getName() + " failed to unpack message", e);
} }
io.grpc.xds.HttpConnectionManager httpConnectionManager = parseHttpConnectionManager( io.grpc.xds.HttpConnectionManager httpConnectionManager = parseHttpConnectionManager(
hcmProto, filterRegistry, parseHttpFilters, false /* isForClient */); hcmProto, filterRegistry, false /* isForClient */);
EnvoyServerProtoData.DownstreamTlsContext downstreamTlsContext = null; EnvoyServerProtoData.DownstreamTlsContext downstreamTlsContext = null;
if (proto.hasTransportSocket()) { if (proto.hasTransportSocket()) {
@ -453,12 +453,12 @@ class XdsListenerResource extends XdsResourceType<LdsUpdate> {
@VisibleForTesting @VisibleForTesting
static io.grpc.xds.HttpConnectionManager parseHttpConnectionManager( static io.grpc.xds.HttpConnectionManager parseHttpConnectionManager(
HttpConnectionManager proto, FilterRegistry filterRegistry, HttpConnectionManager proto, FilterRegistry filterRegistry,
boolean parseHttpFilter, boolean isForClient) throws ResourceInvalidException { boolean isForClient) throws ResourceInvalidException {
if (enableRbac && proto.getXffNumTrustedHops() != 0) { if (proto.getXffNumTrustedHops() != 0) {
throw new ResourceInvalidException( throw new ResourceInvalidException(
"HttpConnectionManager with xff_num_trusted_hops unsupported"); "HttpConnectionManager with xff_num_trusted_hops unsupported");
} }
if (enableRbac && !proto.getOriginalIpDetectionExtensionsList().isEmpty()) { if (!proto.getOriginalIpDetectionExtensionsList().isEmpty()) {
throw new ResourceInvalidException("HttpConnectionManager with " throw new ResourceInvalidException("HttpConnectionManager with "
+ "original_ip_detection_extensions unsupported"); + "original_ip_detection_extensions unsupported");
} }
@ -472,12 +472,10 @@ class XdsListenerResource extends XdsResourceType<LdsUpdate> {
} }
// Parse http filters. // Parse http filters.
List<Filter.NamedFilterConfig> filterConfigs = null;
if (parseHttpFilter) {
if (proto.getHttpFiltersList().isEmpty()) { if (proto.getHttpFiltersList().isEmpty()) {
throw new ResourceInvalidException("Missing HttpFilter in HttpConnectionManager."); throw new ResourceInvalidException("Missing HttpFilter in HttpConnectionManager.");
} }
filterConfigs = new ArrayList<>(); List<Filter.NamedFilterConfig> filterConfigs = new ArrayList<>();
Set<String> names = new HashSet<>(); Set<String> names = new HashSet<>();
for (int i = 0; i < proto.getHttpFiltersCount(); i++) { for (int i = 0; i < proto.getHttpFiltersCount(); i++) {
io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter io.envoyproxy.envoy.extensions.filters.network.http_connection_manager.v3.HttpFilter
@ -508,12 +506,11 @@ class XdsListenerResource extends XdsResourceType<LdsUpdate> {
} }
filterConfigs.add(new Filter.NamedFilterConfig(filterName, filterConfig.getStruct())); filterConfigs.add(new Filter.NamedFilterConfig(filterName, filterConfig.getStruct()));
} }
}
// Parse inlined RouteConfiguration or RDS. // Parse inlined RouteConfiguration or RDS.
if (proto.hasRouteConfig()) { if (proto.hasRouteConfig()) {
List<VirtualHost> virtualHosts = extractVirtualHosts( List<VirtualHost> virtualHosts = extractVirtualHosts(
proto.getRouteConfig(), filterRegistry, parseHttpFilter); proto.getRouteConfig(), filterRegistry);
return io.grpc.xds.HttpConnectionManager.forVirtualHosts( return io.grpc.xds.HttpConnectionManager.forVirtualHosts(
maxStreamDuration, virtualHosts, filterConfigs); maxStreamDuration, virtualHosts, filterConfigs);
} }

View File

@ -47,12 +47,6 @@ abstract class XdsResourceType<T extends ResourceUpdate> {
@VisibleForTesting @VisibleForTesting
static final String HASH_POLICY_FILTER_STATE_KEY = "io.grpc.channel_id"; static final String HASH_POLICY_FILTER_STATE_KEY = "io.grpc.channel_id";
@VisibleForTesting @VisibleForTesting
static boolean enableFaultInjection = getFlag("GRPC_XDS_EXPERIMENTAL_FAULT_INJECTION", true);
@VisibleForTesting
static boolean enableRetry = getFlag("GRPC_XDS_EXPERIMENTAL_ENABLE_RETRY", true);
@VisibleForTesting
static boolean enableRbac = getFlag("GRPC_XDS_EXPERIMENTAL_RBAC", true);
@VisibleForTesting
static boolean enableRouteLookup = getFlag("GRPC_EXPERIMENTAL_XDS_RLS_LB", false); static boolean enableRouteLookup = getFlag("GRPC_EXPERIMENTAL_XDS_RLS_LB", false);
@VisibleForTesting @VisibleForTesting
static boolean enableLeastRequest = static boolean enableLeastRequest =
@ -62,12 +56,6 @@ abstract class XdsResourceType<T extends ResourceUpdate> {
@VisibleForTesting @VisibleForTesting
static boolean enableWrr = getFlag("GRPC_EXPERIMENTAL_XDS_WRR_LB", false); static boolean enableWrr = getFlag("GRPC_EXPERIMENTAL_XDS_WRR_LB", false);
@VisibleForTesting
static boolean enableCustomLbConfig = getFlag("GRPC_EXPERIMENTAL_XDS_CUSTOM_LB_CONFIG", true);
@VisibleForTesting
static boolean enableOutlierDetection = getFlag("GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION",
true);
static final String TYPE_URL_CLUSTER_CONFIG = static final String TYPE_URL_CLUSTER_CONFIG =
"type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig"; "type.googleapis.com/envoy.extensions.clusters.aggregate.v3.ClusterConfig";
static final String TYPE_URL_TYPED_STRUCT_UDPA = static final String TYPE_URL_TYPED_STRUCT_UDPA =

View File

@ -119,17 +119,17 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
throw new ResourceInvalidException("Invalid message type: " + unpackedMessage.getClass()); throw new ResourceInvalidException("Invalid message type: " + unpackedMessage.getClass());
} }
return processRouteConfiguration((RouteConfiguration) unpackedMessage, return processRouteConfiguration((RouteConfiguration) unpackedMessage,
args.filterRegistry, enableFaultInjection); args.filterRegistry);
} }
private static RdsUpdate processRouteConfiguration( private static RdsUpdate processRouteConfiguration(
RouteConfiguration routeConfig, FilterRegistry filterRegistry, boolean parseHttpFilter) RouteConfiguration routeConfig, FilterRegistry filterRegistry)
throws ResourceInvalidException { throws ResourceInvalidException {
return new RdsUpdate(extractVirtualHosts(routeConfig, filterRegistry, parseHttpFilter)); return new RdsUpdate(extractVirtualHosts(routeConfig, filterRegistry));
} }
static List<VirtualHost> extractVirtualHosts( static List<VirtualHost> extractVirtualHosts(
RouteConfiguration routeConfig, FilterRegistry filterRegistry, boolean parseHttpFilter) RouteConfiguration routeConfig, FilterRegistry filterRegistry)
throws ResourceInvalidException { throws ResourceInvalidException {
Map<String, PluginConfig> pluginConfigMap = new HashMap<>(); Map<String, PluginConfig> pluginConfigMap = new HashMap<>();
ImmutableSet.Builder<String> optionalPlugins = ImmutableSet.builder(); ImmutableSet.Builder<String> optionalPlugins = ImmutableSet.builder();
@ -154,7 +154,7 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
for (io.envoyproxy.envoy.config.route.v3.VirtualHost virtualHostProto for (io.envoyproxy.envoy.config.route.v3.VirtualHost virtualHostProto
: routeConfig.getVirtualHostsList()) { : routeConfig.getVirtualHostsList()) {
StructOrError<VirtualHost> virtualHost = StructOrError<VirtualHost> virtualHost =
parseVirtualHost(virtualHostProto, filterRegistry, parseHttpFilter, pluginConfigMap, parseVirtualHost(virtualHostProto, filterRegistry, pluginConfigMap,
optionalPlugins.build()); optionalPlugins.build());
if (virtualHost.getErrorDetail() != null) { if (virtualHost.getErrorDetail() != null) {
throw new ResourceInvalidException( throw new ResourceInvalidException(
@ -167,13 +167,13 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
private static StructOrError<VirtualHost> parseVirtualHost( private static StructOrError<VirtualHost> parseVirtualHost(
io.envoyproxy.envoy.config.route.v3.VirtualHost proto, FilterRegistry filterRegistry, io.envoyproxy.envoy.config.route.v3.VirtualHost proto, FilterRegistry filterRegistry,
boolean parseHttpFilter, Map<String, PluginConfig> pluginConfigMap, Map<String, PluginConfig> pluginConfigMap,
Set<String> optionalPlugins) { Set<String> optionalPlugins) {
String name = proto.getName(); String name = proto.getName();
List<Route> routes = new ArrayList<>(proto.getRoutesCount()); List<Route> routes = new ArrayList<>(proto.getRoutesCount());
for (io.envoyproxy.envoy.config.route.v3.Route routeProto : proto.getRoutesList()) { for (io.envoyproxy.envoy.config.route.v3.Route routeProto : proto.getRoutesList()) {
StructOrError<Route> route = parseRoute( StructOrError<Route> route = parseRoute(
routeProto, filterRegistry, parseHttpFilter, pluginConfigMap, optionalPlugins); routeProto, filterRegistry, pluginConfigMap, optionalPlugins);
if (route == null) { if (route == null) {
continue; continue;
} }
@ -183,10 +183,6 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
} }
routes.add(route.getStruct()); routes.add(route.getStruct());
} }
if (!parseHttpFilter) {
return StructOrError.fromStruct(VirtualHost.create(
name, proto.getDomainsList(), routes, new HashMap<String, Filter.FilterConfig>()));
}
StructOrError<Map<String, Filter.FilterConfig>> overrideConfigs = StructOrError<Map<String, Filter.FilterConfig>> overrideConfigs =
parseOverrideFilterConfigs(proto.getTypedPerFilterConfigMap(), filterRegistry); parseOverrideFilterConfigs(proto.getTypedPerFilterConfigMap(), filterRegistry);
if (overrideConfigs.getErrorDetail() != null) { if (overrideConfigs.getErrorDetail() != null) {
@ -258,7 +254,7 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
@Nullable @Nullable
static StructOrError<Route> parseRoute( static StructOrError<Route> parseRoute(
io.envoyproxy.envoy.config.route.v3.Route proto, FilterRegistry filterRegistry, io.envoyproxy.envoy.config.route.v3.Route proto, FilterRegistry filterRegistry,
boolean parseHttpFilter, Map<String, PluginConfig> pluginConfigMap, Map<String, PluginConfig> pluginConfigMap,
Set<String> optionalPlugins) { Set<String> optionalPlugins) {
StructOrError<RouteMatch> routeMatch = parseRouteMatch(proto.getMatch()); StructOrError<RouteMatch> routeMatch = parseRouteMatch(proto.getMatch());
if (routeMatch == null) { if (routeMatch == null) {
@ -270,8 +266,6 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
+ routeMatch.getErrorDetail()); + routeMatch.getErrorDetail());
} }
Map<String, FilterConfig> overrideConfigs = Collections.emptyMap();
if (parseHttpFilter) {
StructOrError<Map<String, FilterConfig>> overrideConfigsOrError = StructOrError<Map<String, FilterConfig>> overrideConfigsOrError =
parseOverrideFilterConfigs(proto.getTypedPerFilterConfigMap(), filterRegistry); parseOverrideFilterConfigs(proto.getTypedPerFilterConfigMap(), filterRegistry);
if (overrideConfigsOrError.getErrorDetail() != null) { if (overrideConfigsOrError.getErrorDetail() != null) {
@ -279,13 +273,12 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
"Route [" + proto.getName() + "] contains invalid HttpFilter config: " "Route [" + proto.getName() + "] contains invalid HttpFilter config: "
+ overrideConfigsOrError.getErrorDetail()); + overrideConfigsOrError.getErrorDetail());
} }
overrideConfigs = overrideConfigsOrError.getStruct(); Map<String, FilterConfig> overrideConfigs = overrideConfigsOrError.getStruct();
}
switch (proto.getActionCase()) { switch (proto.getActionCase()) {
case ROUTE: case ROUTE:
StructOrError<RouteAction> routeAction = StructOrError<RouteAction> routeAction =
parseRouteAction(proto.getRoute(), filterRegistry, parseHttpFilter, pluginConfigMap, parseRouteAction(proto.getRoute(), filterRegistry, pluginConfigMap,
optionalPlugins); optionalPlugins);
if (routeAction == null) { if (routeAction == null) {
return null; return null;
@ -411,7 +404,7 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
@Nullable @Nullable
static StructOrError<RouteAction> parseRouteAction( static StructOrError<RouteAction> parseRouteAction(
io.envoyproxy.envoy.config.route.v3.RouteAction proto, FilterRegistry filterRegistry, io.envoyproxy.envoy.config.route.v3.RouteAction proto, FilterRegistry filterRegistry,
boolean parseHttpFilter, Map<String, PluginConfig> pluginConfigMap, Map<String, PluginConfig> pluginConfigMap,
Set<String> optionalPlugins) { Set<String> optionalPlugins) {
Long timeoutNano = null; Long timeoutNano = null;
if (proto.hasMaxStreamDuration()) { if (proto.hasMaxStreamDuration()) {
@ -424,7 +417,7 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
} }
} }
RetryPolicy retryPolicy = null; RetryPolicy retryPolicy = null;
if (enableRetry && proto.hasRetryPolicy()) { if (proto.hasRetryPolicy()) {
StructOrError<RetryPolicy> retryPolicyOrError = parseRetryPolicy(proto.getRetryPolicy()); StructOrError<RetryPolicy> retryPolicyOrError = parseRetryPolicy(proto.getRetryPolicy());
if (retryPolicyOrError != null) { if (retryPolicyOrError != null) {
if (retryPolicyOrError.getErrorDetail() != null) { if (retryPolicyOrError.getErrorDetail() != null) {
@ -482,7 +475,7 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
for (io.envoyproxy.envoy.config.route.v3.WeightedCluster.ClusterWeight clusterWeight for (io.envoyproxy.envoy.config.route.v3.WeightedCluster.ClusterWeight clusterWeight
: clusterWeights) { : clusterWeights) {
StructOrError<ClusterWeight> clusterWeightOrError = StructOrError<ClusterWeight> clusterWeightOrError =
parseClusterWeight(clusterWeight, filterRegistry, parseHttpFilter); parseClusterWeight(clusterWeight, filterRegistry);
if (clusterWeightOrError.getErrorDetail() != null) { if (clusterWeightOrError.getErrorDetail() != null) {
return StructOrError.fromError("RouteAction contains invalid ClusterWeight: " return StructOrError.fromError("RouteAction contains invalid ClusterWeight: "
+ clusterWeightOrError.getErrorDetail()); + clusterWeightOrError.getErrorDetail());
@ -586,11 +579,7 @@ class XdsRouteConfigureResource extends XdsResourceType<RdsUpdate> {
@VisibleForTesting @VisibleForTesting
static StructOrError<VirtualHost.Route.RouteAction.ClusterWeight> parseClusterWeight( static StructOrError<VirtualHost.Route.RouteAction.ClusterWeight> parseClusterWeight(
io.envoyproxy.envoy.config.route.v3.WeightedCluster.ClusterWeight proto, io.envoyproxy.envoy.config.route.v3.WeightedCluster.ClusterWeight proto,
FilterRegistry filterRegistry, boolean parseHttpFilter) { FilterRegistry filterRegistry) {
if (!parseHttpFilter) {
return StructOrError.fromStruct(ClusterWeight.create(proto.getName(),
proto.getWeight().getValue(), new HashMap<String, Filter.FilterConfig>()));
}
StructOrError<Map<String, Filter.FilterConfig>> overrideConfigs = StructOrError<Map<String, Filter.FilterConfig>> overrideConfigs =
parseOverrideFilterConfigs(proto.getTypedPerFilterConfigMap(), filterRegistry); parseOverrideFilterConfigs(proto.getTypedPerFilterConfigMap(), filterRegistry);
if (overrideConfigs.getErrorDetail() != null) { if (overrideConfigs.getErrorDetail() != null) {

View File

@ -142,14 +142,14 @@ public class LoadBalancerConfigFactoryTest {
public void roundRobin() throws ResourceInvalidException { public void roundRobin() throws ResourceInvalidException {
Cluster cluster = newCluster(buildWrrPolicy(ROUND_ROBIN_POLICY)); Cluster cluster = newCluster(buildWrrPolicy(ROUND_ROBIN_POLICY));
assertThat(newLbConfig(cluster, true, true, true)).isEqualTo(VALID_ROUND_ROBIN_CONFIG); assertThat(newLbConfig(cluster, true, true)).isEqualTo(VALID_ROUND_ROBIN_CONFIG);
} }
@Test @Test
public void weightedRoundRobin() throws ResourceInvalidException { public void weightedRoundRobin() throws ResourceInvalidException {
Cluster cluster = newCluster(buildWrrPolicy(WRR_POLICY)); Cluster cluster = newCluster(buildWrrPolicy(WRR_POLICY));
assertThat(newLbConfig(cluster, true, true, true)).isEqualTo(VALID_WRR_CONFIG); assertThat(newLbConfig(cluster, true, true)).isEqualTo(VALID_WRR_CONFIG);
} }
@Test @Test
@ -166,7 +166,7 @@ public class LoadBalancerConfigFactoryTest {
.build()) .build())
.build())); .build()));
assertResourceInvalidExceptionThrown(cluster, true, true, true, assertResourceInvalidExceptionThrown(cluster, true, true,
"Invalid duration in weighted round robin config"); "Invalid duration in weighted round robin config");
} }
@ -174,14 +174,14 @@ public class LoadBalancerConfigFactoryTest {
public void weightedRoundRobin_fallback_roundrobin() throws ResourceInvalidException { public void weightedRoundRobin_fallback_roundrobin() throws ResourceInvalidException {
Cluster cluster = newCluster(buildWrrPolicy(WRR_POLICY, ROUND_ROBIN_POLICY)); Cluster cluster = newCluster(buildWrrPolicy(WRR_POLICY, ROUND_ROBIN_POLICY));
assertThat(newLbConfig(cluster, true, true, false)).isEqualTo(VALID_ROUND_ROBIN_CONFIG); assertThat(newLbConfig(cluster, true, false)).isEqualTo(VALID_ROUND_ROBIN_CONFIG);
} }
@Test @Test
public void roundRobin_legacy() throws ResourceInvalidException { public void roundRobin_legacy() throws ResourceInvalidException {
Cluster cluster = Cluster.newBuilder().setLbPolicy(LbPolicy.ROUND_ROBIN).build(); Cluster cluster = Cluster.newBuilder().setLbPolicy(LbPolicy.ROUND_ROBIN).build();
assertThat(newLbConfig(cluster, true, true, true)).isEqualTo(VALID_ROUND_ROBIN_CONFIG); assertThat(newLbConfig(cluster, true, true)).isEqualTo(VALID_ROUND_ROBIN_CONFIG);
} }
@Test @Test
@ -190,7 +190,7 @@ public class LoadBalancerConfigFactoryTest {
.setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder().addPolicies(RING_HASH_POLICY)) .setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder().addPolicies(RING_HASH_POLICY))
.build(); .build();
assertThat(newLbConfig(cluster, true, true, true)).isEqualTo(VALID_RING_HASH_CONFIG); assertThat(newLbConfig(cluster, true, true)).isEqualTo(VALID_RING_HASH_CONFIG);
} }
@Test @Test
@ -200,7 +200,7 @@ public class LoadBalancerConfigFactoryTest {
.setMaximumRingSize(UInt64Value.of(RING_HASH_MAX_RING_SIZE)) .setMaximumRingSize(UInt64Value.of(RING_HASH_MAX_RING_SIZE))
.setHashFunction(HashFunction.XX_HASH)).build(); .setHashFunction(HashFunction.XX_HASH)).build();
assertThat(newLbConfig(cluster, true, true, true)).isEqualTo(VALID_RING_HASH_CONFIG); assertThat(newLbConfig(cluster, true, true)).isEqualTo(VALID_RING_HASH_CONFIG);
} }
@Test @Test
@ -212,7 +212,7 @@ public class LoadBalancerConfigFactoryTest {
.setMaximumRingSize(UInt64Value.of(RING_HASH_MAX_RING_SIZE)) .setMaximumRingSize(UInt64Value.of(RING_HASH_MAX_RING_SIZE))
.setHashFunction(RingHash.HashFunction.MURMUR_HASH_2).build()))).build()); .setHashFunction(RingHash.HashFunction.MURMUR_HASH_2).build()))).build());
assertResourceInvalidExceptionThrown(cluster, true, true, true, "Invalid ring hash function"); assertResourceInvalidExceptionThrown(cluster, true, true, "Invalid ring hash function");
} }
@Test @Test
@ -220,7 +220,7 @@ public class LoadBalancerConfigFactoryTest {
Cluster cluster = Cluster.newBuilder().setLbPolicy(LbPolicy.RING_HASH).setRingHashLbConfig( Cluster cluster = Cluster.newBuilder().setLbPolicy(LbPolicy.RING_HASH).setRingHashLbConfig(
RingHashLbConfig.newBuilder().setHashFunction(HashFunction.MURMUR_HASH_2)).build(); RingHashLbConfig.newBuilder().setHashFunction(HashFunction.MURMUR_HASH_2)).build();
assertResourceInvalidExceptionThrown(cluster, true, true, true, "invalid ring hash function"); assertResourceInvalidExceptionThrown(cluster, true, true, "invalid ring hash function");
} }
@Test @Test
@ -229,7 +229,7 @@ public class LoadBalancerConfigFactoryTest {
.setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder().addPolicies(LEAST_REQUEST_POLICY)) .setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder().addPolicies(LEAST_REQUEST_POLICY))
.build(); .build();
assertThat(newLbConfig(cluster, true, true, true)).isEqualTo(VALID_LEAST_REQUEST_CONFIG); assertThat(newLbConfig(cluster, true, true)).isEqualTo(VALID_LEAST_REQUEST_CONFIG);
} }
@Test @Test
@ -241,7 +241,7 @@ public class LoadBalancerConfigFactoryTest {
LeastRequestLbConfig.newBuilder() LeastRequestLbConfig.newBuilder()
.setChoiceCount(UInt32Value.of(LEAST_REQUEST_CHOICE_COUNT))).build(); .setChoiceCount(UInt32Value.of(LEAST_REQUEST_CHOICE_COUNT))).build();
LbConfig lbConfig = newLbConfig(cluster, true, true, true); LbConfig lbConfig = newLbConfig(cluster, true, true);
assertThat(lbConfig.getPolicyName()).isEqualTo("wrr_locality_experimental"); assertThat(lbConfig.getPolicyName()).isEqualTo("wrr_locality_experimental");
List<LbConfig> childConfigs = ServiceConfigUtil.unwrapLoadBalancingConfigList( List<LbConfig> childConfigs = ServiceConfigUtil.unwrapLoadBalancingConfigList(
@ -258,14 +258,14 @@ public class LoadBalancerConfigFactoryTest {
Cluster cluster = Cluster.newBuilder().setLbPolicy(LbPolicy.LEAST_REQUEST).build(); Cluster cluster = Cluster.newBuilder().setLbPolicy(LbPolicy.LEAST_REQUEST).build();
assertResourceInvalidExceptionThrown(cluster, false, true, true, "unsupported lb policy"); assertResourceInvalidExceptionThrown(cluster, false, true, "unsupported lb policy");
} }
@Test @Test
public void customRootLb_providerRegistered() throws ResourceInvalidException { public void customRootLb_providerRegistered() throws ResourceInvalidException {
LoadBalancerRegistry.getDefaultRegistry().register(CUSTOM_POLICY_PROVIDER); LoadBalancerRegistry.getDefaultRegistry().register(CUSTOM_POLICY_PROVIDER);
assertThat(newLbConfig(newCluster(CUSTOM_POLICY), false, true, assertThat(newLbConfig(newCluster(CUSTOM_POLICY), false,
true)).isEqualTo(VALID_CUSTOM_CONFIG); true)).isEqualTo(VALID_CUSTOM_CONFIG);
} }
@ -275,7 +275,7 @@ public class LoadBalancerConfigFactoryTest {
.setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder().addPolicies(CUSTOM_POLICY)) .setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder().addPolicies(CUSTOM_POLICY))
.build(); .build();
assertResourceInvalidExceptionThrown(cluster, false, true, true,"Invalid LoadBalancingPolicy"); assertResourceInvalidExceptionThrown(cluster, false, true,"Invalid LoadBalancingPolicy");
} }
// When a provider for the endpoint picking custom policy is available, the configuration should // When a provider for the endpoint picking custom policy is available, the configuration should
@ -287,7 +287,7 @@ public class LoadBalancerConfigFactoryTest {
Cluster cluster = Cluster.newBuilder().setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder() Cluster cluster = Cluster.newBuilder().setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder()
.addPolicies(buildWrrPolicy(CUSTOM_POLICY, ROUND_ROBIN_POLICY))).build(); .addPolicies(buildWrrPolicy(CUSTOM_POLICY, ROUND_ROBIN_POLICY))).build();
assertThat(newLbConfig(cluster, false, true, true)).isEqualTo(VALID_CUSTOM_CONFIG_IN_WRR); assertThat(newLbConfig(cluster, false, true)).isEqualTo(VALID_CUSTOM_CONFIG_IN_WRR);
} }
// When a provider for the endpoint picking custom policy is available, the configuration should // When a provider for the endpoint picking custom policy is available, the configuration should
@ -299,7 +299,7 @@ public class LoadBalancerConfigFactoryTest {
Cluster cluster = Cluster.newBuilder().setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder() Cluster cluster = Cluster.newBuilder().setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder()
.addPolicies(buildWrrPolicy(CUSTOM_POLICY_UDPA, ROUND_ROBIN_POLICY))).build(); .addPolicies(buildWrrPolicy(CUSTOM_POLICY_UDPA, ROUND_ROBIN_POLICY))).build();
assertThat(newLbConfig(cluster, false, true, true)).isEqualTo(VALID_CUSTOM_CONFIG_IN_WRR); assertThat(newLbConfig(cluster, false, true)).isEqualTo(VALID_CUSTOM_CONFIG_IN_WRR);
} }
// When a provider for the custom wrr_locality child policy is NOT available, we should fall back // When a provider for the custom wrr_locality child policy is NOT available, we should fall back
@ -309,7 +309,7 @@ public class LoadBalancerConfigFactoryTest {
Cluster cluster = Cluster.newBuilder().setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder() Cluster cluster = Cluster.newBuilder().setLoadBalancingPolicy(LoadBalancingPolicy.newBuilder()
.addPolicies(buildWrrPolicy(CUSTOM_POLICY, ROUND_ROBIN_POLICY))).build(); .addPolicies(buildWrrPolicy(CUSTOM_POLICY, ROUND_ROBIN_POLICY))).build();
assertThat(newLbConfig(cluster, false, true, true)).isEqualTo(VALID_ROUND_ROBIN_CONFIG); assertThat(newLbConfig(cluster, false, true)).isEqualTo(VALID_ROUND_ROBIN_CONFIG);
} }
// When a provider for the custom wrr_locality child policy is NOT available and no alternative // When a provider for the custom wrr_locality child policy is NOT available and no alternative
@ -319,18 +319,7 @@ public class LoadBalancerConfigFactoryTest {
Cluster cluster = Cluster.newBuilder().setLoadBalancingPolicy( Cluster cluster = Cluster.newBuilder().setLoadBalancingPolicy(
LoadBalancingPolicy.newBuilder().addPolicies(buildWrrPolicy(CUSTOM_POLICY))).build(); LoadBalancingPolicy.newBuilder().addPolicies(buildWrrPolicy(CUSTOM_POLICY))).build();
assertResourceInvalidExceptionThrown(cluster, false, true, true, "Invalid LoadBalancingPolicy"); assertResourceInvalidExceptionThrown(cluster, false, true, "Invalid LoadBalancingPolicy");
}
@Test
public void customConfig_notEnabled() throws ResourceInvalidException {
Cluster cluster = Cluster.newBuilder()
.setLoadBalancingPolicy(
LoadBalancingPolicy.newBuilder().addPolicies(RING_HASH_POLICY))
.build();
// Custom LB flag not set, so we use old logic that will default to round_robin.
assertThat(newLbConfig(cluster, true, false, true)).isEqualTo(VALID_ROUND_ROBIN_CONFIG);
} }
@Test @Test
@ -357,7 +346,7 @@ public class LoadBalancerConfigFactoryTest {
buildWrrPolicy( buildWrrPolicy(
ROUND_ROBIN_POLICY))))))))))))))))))).build(); ROUND_ROBIN_POLICY))))))))))))))))))).build();
assertResourceInvalidExceptionThrown(cluster, false, true, true, assertResourceInvalidExceptionThrown(cluster, false, true,
"Maximum LB config recursion depth reached"); "Maximum LB config recursion depth reached");
} }
@ -373,18 +362,17 @@ public class LoadBalancerConfigFactoryTest {
.build()))).build(); .build()))).build();
} }
private LbConfig newLbConfig(Cluster cluster, boolean enableLeastRequest, private LbConfig newLbConfig(Cluster cluster, boolean enableLeastRequest, boolean enableWrr)
boolean enableCustomConfig, boolean enableWrr)
throws ResourceInvalidException { throws ResourceInvalidException {
return ServiceConfigUtil.unwrapLoadBalancingConfig( return ServiceConfigUtil.unwrapLoadBalancingConfig(
LoadBalancerConfigFactory.newConfig(cluster, enableLeastRequest, enableCustomConfig, LoadBalancerConfigFactory.newConfig(cluster, enableLeastRequest,
enableWrr)); enableWrr));
} }
private void assertResourceInvalidExceptionThrown(Cluster cluster, boolean enableLeastRequest, private void assertResourceInvalidExceptionThrown(Cluster cluster, boolean enableLeastRequest,
boolean enableCustomConfig, boolean enableWrr, String expectedMessage) { boolean enableWrr, String expectedMessage) {
try { try {
newLbConfig(cluster, enableLeastRequest, enableCustomConfig, enableWrr); newLbConfig(cluster, enableLeastRequest, enableWrr);
} catch (ResourceInvalidException e) { } catch (ResourceInvalidException e) {
assertThat(e).hasMessageThat().contains(expectedMessage); assertThat(e).hasMessageThat().contains(expectedMessage);
return; return;

View File

@ -164,18 +164,12 @@ public class XdsClientImplDataTest {
@Rule @Rule
public final ExpectedException thrown = ExpectedException.none(); public final ExpectedException thrown = ExpectedException.none();
private final FilterRegistry filterRegistry = FilterRegistry.getDefaultRegistry(); private final FilterRegistry filterRegistry = FilterRegistry.getDefaultRegistry();
private boolean originalEnableRetry;
private boolean originalEnableRbac;
private boolean originalEnableRouteLookup; private boolean originalEnableRouteLookup;
private boolean originalEnableLeastRequest; private boolean originalEnableLeastRequest;
private boolean originalEnableWrr; private boolean originalEnableWrr;
@Before @Before
public void setUp() { public void setUp() {
originalEnableRetry = XdsResourceType.enableRetry;
assertThat(originalEnableRetry).isTrue();
originalEnableRbac = XdsResourceType.enableRbac;
assertThat(originalEnableRbac).isTrue();
originalEnableRouteLookup = XdsResourceType.enableRouteLookup; originalEnableRouteLookup = XdsResourceType.enableRouteLookup;
assertThat(originalEnableRouteLookup).isFalse(); assertThat(originalEnableRouteLookup).isFalse();
originalEnableLeastRequest = XdsResourceType.enableLeastRequest; originalEnableLeastRequest = XdsResourceType.enableLeastRequest;
@ -186,8 +180,6 @@ public class XdsClientImplDataTest {
@After @After
public void tearDown() { public void tearDown() {
XdsResourceType.enableRetry = originalEnableRetry;
XdsResourceType.enableRbac = originalEnableRbac;
XdsResourceType.enableRouteLookup = originalEnableRouteLookup; XdsResourceType.enableRouteLookup = originalEnableRouteLookup;
XdsResourceType.enableLeastRequest = originalEnableLeastRequest; XdsResourceType.enableLeastRequest = originalEnableLeastRequest;
XdsResourceType.enableWrr = originalEnableWrr; XdsResourceType.enableWrr = originalEnableWrr;
@ -206,7 +198,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo")) .setCluster("cluster-foo"))
.build(); .build();
StructOrError<Route> struct = XdsRouteConfigureResource.parseRoute( StructOrError<Route> struct = XdsRouteConfigureResource.parseRoute(
proto, filterRegistry, false, ImmutableMap.of(), ImmutableSet.of()); proto, filterRegistry, ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getErrorDetail()).isNull(); assertThat(struct.getErrorDetail()).isNull();
assertThat(struct.getStruct()) assertThat(struct.getStruct())
.isEqualTo( .isEqualTo(
@ -229,7 +221,7 @@ public class XdsClientImplDataTest {
.setNonForwardingAction(NonForwardingAction.getDefaultInstance()) .setNonForwardingAction(NonForwardingAction.getDefaultInstance())
.build(); .build();
StructOrError<Route> struct = XdsRouteConfigureResource.parseRoute( StructOrError<Route> struct = XdsRouteConfigureResource.parseRoute(
proto, filterRegistry, false, ImmutableMap.of(), ImmutableSet.of()); proto, filterRegistry, ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct()) assertThat(struct.getStruct())
.isEqualTo( .isEqualTo(
Route.forNonForwardingAction( Route.forNonForwardingAction(
@ -248,7 +240,7 @@ public class XdsClientImplDataTest {
.setRedirect(RedirectAction.getDefaultInstance()) .setRedirect(RedirectAction.getDefaultInstance())
.build(); .build();
res = XdsRouteConfigureResource.parseRoute( res = XdsRouteConfigureResource.parseRoute(
redirectRoute, filterRegistry, false, ImmutableMap.of(), ImmutableSet.of()); redirectRoute, filterRegistry, ImmutableMap.of(), ImmutableSet.of());
assertThat(res.getStruct()).isNull(); assertThat(res.getStruct()).isNull();
assertThat(res.getErrorDetail()) assertThat(res.getErrorDetail())
.isEqualTo("Route [route-blade] with unknown action type: REDIRECT"); .isEqualTo("Route [route-blade] with unknown action type: REDIRECT");
@ -260,7 +252,7 @@ public class XdsClientImplDataTest {
.setDirectResponse(DirectResponseAction.getDefaultInstance()) .setDirectResponse(DirectResponseAction.getDefaultInstance())
.build(); .build();
res = XdsRouteConfigureResource.parseRoute( res = XdsRouteConfigureResource.parseRoute(
directResponseRoute, filterRegistry, false, ImmutableMap.of(), ImmutableSet.of()); directResponseRoute, filterRegistry, ImmutableMap.of(), ImmutableSet.of());
assertThat(res.getStruct()).isNull(); assertThat(res.getStruct()).isNull();
assertThat(res.getErrorDetail()) assertThat(res.getErrorDetail())
.isEqualTo("Route [route-blade] with unknown action type: DIRECT_RESPONSE"); .isEqualTo("Route [route-blade] with unknown action type: DIRECT_RESPONSE");
@ -272,7 +264,7 @@ public class XdsClientImplDataTest {
.setFilterAction(FilterAction.getDefaultInstance()) .setFilterAction(FilterAction.getDefaultInstance())
.build(); .build();
res = XdsRouteConfigureResource.parseRoute( res = XdsRouteConfigureResource.parseRoute(
filterRoute, filterRegistry, false, ImmutableMap.of(), ImmutableSet.of()); filterRoute, filterRegistry, ImmutableMap.of(), ImmutableSet.of());
assertThat(res.getStruct()).isNull(); assertThat(res.getStruct()).isNull();
assertThat(res.getErrorDetail()) assertThat(res.getErrorDetail())
.isEqualTo("Route [route-blade] with unknown action type: FILTER_ACTION"); .isEqualTo("Route [route-blade] with unknown action type: FILTER_ACTION");
@ -294,7 +286,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo")) .setCluster("cluster-foo"))
.build(); .build();
assertThat(XdsRouteConfigureResource.parseRoute( assertThat(XdsRouteConfigureResource.parseRoute(
proto, filterRegistry, false, ImmutableMap.of(), ImmutableSet.of())) proto, filterRegistry, ImmutableMap.of(), ImmutableSet.of()))
.isNull(); .isNull();
} }
@ -311,7 +303,7 @@ public class XdsClientImplDataTest {
.setClusterHeader("cluster header")) // cluster_header action not supported .setClusterHeader("cluster header")) // cluster_header action not supported
.build(); .build();
assertThat(XdsRouteConfigureResource.parseRoute( assertThat(XdsRouteConfigureResource.parseRoute(
proto, filterRegistry, false, ImmutableMap.of(), ImmutableSet.of())) proto, filterRegistry, ImmutableMap.of(), ImmutableSet.of()))
.isNull(); .isNull();
} }
@ -520,7 +512,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getErrorDetail()).isNull(); assertThat(struct.getErrorDetail()).isNull();
assertThat(struct.getStruct().cluster()).isEqualTo("cluster-foo"); assertThat(struct.getStruct().cluster()).isEqualTo("cluster-foo");
@ -544,7 +536,7 @@ public class XdsClientImplDataTest {
.setWeight(UInt32Value.newBuilder().setValue(70)))) .setWeight(UInt32Value.newBuilder().setValue(70))))
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getErrorDetail()).isNull(); assertThat(struct.getErrorDetail()).isNull();
assertThat(struct.getStruct().cluster()).isNull(); assertThat(struct.getStruct().cluster()).isNull();
@ -570,7 +562,7 @@ public class XdsClientImplDataTest {
.setWeight(UInt32Value.newBuilder().setValue(0)))) .setWeight(UInt32Value.newBuilder().setValue(0))))
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getErrorDetail()).isEqualTo("Sum of cluster weights should be above 0."); assertThat(struct.getErrorDetail()).isEqualTo("Sum of cluster weights should be above 0.");
} }
@ -586,7 +578,7 @@ public class XdsClientImplDataTest {
.setMaxStreamDuration(Durations.fromMillis(20L))) .setMaxStreamDuration(Durations.fromMillis(20L)))
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct().timeoutNano()).isEqualTo(TimeUnit.SECONDS.toNanos(5L)); assertThat(struct.getStruct().timeoutNano()).isEqualTo(TimeUnit.SECONDS.toNanos(5L));
} }
@ -601,7 +593,7 @@ public class XdsClientImplDataTest {
.setMaxStreamDuration(Durations.fromSeconds(5L))) .setMaxStreamDuration(Durations.fromSeconds(5L)))
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct().timeoutNano()).isEqualTo(TimeUnit.SECONDS.toNanos(5L)); assertThat(struct.getStruct().timeoutNano()).isEqualTo(TimeUnit.SECONDS.toNanos(5L));
} }
@ -613,14 +605,13 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct().timeoutNano()).isNull(); assertThat(struct.getStruct().timeoutNano()).isNull();
} }
@Test @Test
public void parseRouteAction_withRetryPolicy() { public void parseRouteAction_withRetryPolicy() {
XdsResourceType.enableRetry = true;
RetryPolicy.Builder builder = RetryPolicy.newBuilder() RetryPolicy.Builder builder = RetryPolicy.newBuilder()
.setNumRetries(UInt32Value.of(3)) .setNumRetries(UInt32Value.of(3))
.setRetryBackOff( .setRetryBackOff(
@ -636,7 +627,7 @@ public class XdsClientImplDataTest {
.setRetryPolicy(builder.build()) .setRetryPolicy(builder.build())
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
RouteAction.RetryPolicy retryPolicy = struct.getStruct().retryPolicy(); RouteAction.RetryPolicy retryPolicy = struct.getStruct().retryPolicy();
assertThat(retryPolicy.maxAttempts()).isEqualTo(4); assertThat(retryPolicy.maxAttempts()).isEqualTo(4);
@ -660,7 +651,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder.build()) .setRetryPolicy(builder.build())
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct().retryPolicy()).isNotNull(); assertThat(struct.getStruct().retryPolicy()).isNotNull();
assertThat(struct.getStruct().retryPolicy().retryableStatusCodes()).isEmpty(); assertThat(struct.getStruct().retryPolicy().retryableStatusCodes()).isEmpty();
@ -673,7 +664,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getErrorDetail()).isEqualTo("No base_interval specified in retry_backoff"); assertThat(struct.getErrorDetail()).isEqualTo("No base_interval specified in retry_backoff");
@ -683,7 +674,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
retryPolicy = struct.getStruct().retryPolicy(); retryPolicy = struct.getStruct().retryPolicy();
assertThat(retryPolicy.maxBackoff()).isEqualTo(Durations.fromMillis(500 * 10)); assertThat(retryPolicy.maxBackoff()).isEqualTo(Durations.fromMillis(500 * 10));
@ -694,7 +685,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getErrorDetail()) assertThat(struct.getErrorDetail())
.isEqualTo("base_interval in retry_backoff must be positive"); .isEqualTo("base_interval in retry_backoff must be positive");
@ -707,7 +698,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getErrorDetail()) assertThat(struct.getErrorDetail())
.isEqualTo("max_interval in retry_backoff cannot be less than base_interval"); .isEqualTo("max_interval in retry_backoff cannot be less than base_interval");
@ -720,7 +711,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getErrorDetail()) assertThat(struct.getErrorDetail())
.isEqualTo("max_interval in retry_backoff cannot be less than base_interval"); .isEqualTo("max_interval in retry_backoff cannot be less than base_interval");
@ -733,7 +724,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct().retryPolicy().initialBackoff()) assertThat(struct.getStruct().retryPolicy().initialBackoff())
.isEqualTo(Durations.fromMillis(1)); .isEqualTo(Durations.fromMillis(1));
@ -749,7 +740,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
retryPolicy = struct.getStruct().retryPolicy(); retryPolicy = struct.getStruct().retryPolicy();
assertThat(retryPolicy.initialBackoff()).isEqualTo(Durations.fromMillis(25)); assertThat(retryPolicy.initialBackoff()).isEqualTo(Durations.fromMillis(25));
@ -768,7 +759,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct().retryPolicy().retryableStatusCodes()) assertThat(struct.getStruct().retryPolicy().retryableStatusCodes())
.containsExactly(Code.CANCELLED); .containsExactly(Code.CANCELLED);
@ -786,7 +777,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct().retryPolicy().retryableStatusCodes()) assertThat(struct.getStruct().retryPolicy().retryableStatusCodes())
.containsExactly(Code.CANCELLED); .containsExactly(Code.CANCELLED);
@ -804,7 +795,7 @@ public class XdsClientImplDataTest {
.setCluster("cluster-foo") .setCluster("cluster-foo")
.setRetryPolicy(builder) .setRetryPolicy(builder)
.build(); .build();
struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, struct = XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct.getStruct().retryPolicy().retryableStatusCodes()) assertThat(struct.getStruct().retryPolicy().retryableStatusCodes())
.containsExactly(Code.CANCELLED); .containsExactly(Code.CANCELLED);
@ -843,7 +834,7 @@ public class XdsClientImplDataTest {
QueryParameter.newBuilder().setName("param"))) // unsupported QueryParameter.newBuilder().setName("param"))) // unsupported
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
List<HashPolicy> policies = struct.getStruct().hashPolicies(); List<HashPolicy> policies = struct.getStruct().hashPolicies();
assertThat(policies).hasSize(2); assertThat(policies).hasSize(2);
@ -863,7 +854,7 @@ public class XdsClientImplDataTest {
io.envoyproxy.envoy.config.route.v3.RouteAction.newBuilder() io.envoyproxy.envoy.config.route.v3.RouteAction.newBuilder()
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct).isNull(); assertThat(struct).isNull();
} }
@ -876,7 +867,7 @@ public class XdsClientImplDataTest {
.setClusterSpecifierPlugin(CLUSTER_SPECIFIER_PLUGIN.name()) .setClusterSpecifierPlugin(CLUSTER_SPECIFIER_PLUGIN.name())
.build(); .build();
StructOrError<RouteAction> struct = StructOrError<RouteAction> struct =
XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry, false, XdsRouteConfigureResource.parseRouteAction(proto, filterRegistry,
ImmutableMap.of(), ImmutableSet.of()); ImmutableMap.of(), ImmutableSet.of());
assertThat(struct).isNull(); assertThat(struct).isNull();
} }
@ -889,7 +880,7 @@ public class XdsClientImplDataTest {
.setWeight(UInt32Value.newBuilder().setValue(30)) .setWeight(UInt32Value.newBuilder().setValue(30))
.build(); .build();
ClusterWeight clusterWeight = ClusterWeight clusterWeight =
XdsRouteConfigureResource.parseClusterWeight(proto, filterRegistry, false).getStruct(); XdsRouteConfigureResource.parseClusterWeight(proto, filterRegistry).getStruct();
assertThat(clusterWeight.name()).isEqualTo("cluster-foo"); assertThat(clusterWeight.name()).isEqualTo("cluster-foo");
assertThat(clusterWeight.weight()).isEqualTo(30); assertThat(clusterWeight.weight()).isEqualTo(30);
} }
@ -1354,7 +1345,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("HttpConnectionManager with xff_num_trusted_hops unsupported"); thrown.expectMessage("HttpConnectionManager with xff_num_trusted_hops unsupported");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, false /* does not matter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -1368,7 +1359,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("HttpConnectionManager with original_ip_detection_extensions unsupported"); thrown.expectMessage("HttpConnectionManager with original_ip_detection_extensions unsupported");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, false /* does not matter */, false); hcm, filterRegistry, false);
} }
@Test @Test
@ -1379,11 +1370,14 @@ public class XdsClientImplDataTest {
.setCommonHttpProtocolOptions( .setCommonHttpProtocolOptions(
HttpProtocolOptions.newBuilder() HttpProtocolOptions.newBuilder()
.setMaxStreamDuration(Durations.fromNanos(1000L))) .setMaxStreamDuration(Durations.fromNanos(1000L)))
.addHttpFilters(
HttpFilter.newBuilder().setName("terminal").setTypedConfig(
Any.pack(Router.newBuilder().build())).setIsOptional(true))
.build(); .build();
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("HttpConnectionManager neither has inlined route_config nor RDS"); thrown.expectMessage("HttpConnectionManager neither has inlined route_config nor RDS");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, false /* does not matter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -1402,7 +1396,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("HttpConnectionManager contains duplicate HttpFilter: envoy.filter.foo"); thrown.expectMessage("HttpConnectionManager contains duplicate HttpFilter: envoy.filter.foo");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, true /* parseHttpFilter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -1420,7 +1414,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("The last HttpFilter must be a terminal filter: envoy.filter.bar"); thrown.expectMessage("The last HttpFilter must be a terminal filter: envoy.filter.bar");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, true /* parseHttpFilter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -1438,7 +1432,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("A terminal HttpFilter must be the last filter: terminal"); thrown.expectMessage("A terminal HttpFilter must be the last filter: terminal");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, true /* parseHttpFilter */, hcm, filterRegistry,
true); true);
} }
@ -1454,7 +1448,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("The last HttpFilter must be a terminal filter: envoy.filter.bar"); thrown.expectMessage("The last HttpFilter must be a terminal filter: envoy.filter.bar");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, true /* parseHttpFilter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -1466,7 +1460,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("Missing HttpFilter in HttpConnectionManager."); thrown.expectMessage("Missing HttpFilter in HttpConnectionManager.");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, true /* parseHttpFilter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -1509,10 +1503,13 @@ public class XdsClientImplDataTest {
.addVirtualHosts(io.envoyproxy.envoy.config.route.v3.VirtualHost.newBuilder() .addVirtualHosts(io.envoyproxy.envoy.config.route.v3.VirtualHost.newBuilder()
.setName("virtual-host-1") .setName("virtual-host-1")
.addRoutes(route))) .addRoutes(route)))
.addHttpFilters(
HttpFilter.newBuilder().setName("terminal").setTypedConfig(
Any.pack(Router.newBuilder().build())).setIsOptional(true))
.build(); .build();
io.grpc.xds.HttpConnectionManager parsedHcm = XdsListenerResource.parseHttpConnectionManager( io.grpc.xds.HttpConnectionManager parsedHcm = XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, false /* parseHttpFilter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
VirtualHost virtualHost = Iterables.getOnlyElement(parsedHcm.virtualHosts()); VirtualHost virtualHost = Iterables.getOnlyElement(parsedHcm.virtualHosts());
@ -1583,13 +1580,16 @@ public class XdsClientImplDataTest {
.addVirtualHosts(io.envoyproxy.envoy.config.route.v3.VirtualHost.newBuilder() .addVirtualHosts(io.envoyproxy.envoy.config.route.v3.VirtualHost.newBuilder()
.setName("virtual-host-1") .setName("virtual-host-1")
.addRoutes(route))) .addRoutes(route)))
.addHttpFilters(
HttpFilter.newBuilder().setName("terminal").setTypedConfig(
Any.pack(Router.newBuilder().build())).setIsOptional(true))
.build(); .build();
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("Multiple ClusterSpecifierPlugins with the same name: rls-plugin-1"); thrown.expectMessage("Multiple ClusterSpecifierPlugins with the same name: rls-plugin-1");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, false /* parseHttpFilter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -1632,13 +1632,16 @@ public class XdsClientImplDataTest {
.addVirtualHosts(io.envoyproxy.envoy.config.route.v3.VirtualHost.newBuilder() .addVirtualHosts(io.envoyproxy.envoy.config.route.v3.VirtualHost.newBuilder()
.setName("virtual-host-1") .setName("virtual-host-1")
.addRoutes(route))) .addRoutes(route)))
.addHttpFilters(
HttpFilter.newBuilder().setName("terminal").setTypedConfig(
Any.pack(Router.newBuilder().build())).setIsOptional(true))
.build(); .build();
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("ClusterSpecifierPlugin for [invalid-plugin-name] not found"); thrown.expectMessage("ClusterSpecifierPlugin for [invalid-plugin-name] not found");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm, filterRegistry, false /* parseHttpFilter */, hcm, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -1708,8 +1711,12 @@ public class XdsClientImplDataTest {
.addRoutes(optionalRoute)) .addRoutes(optionalRoute))
.build(); .build();
io.grpc.xds.HttpConnectionManager parsedHcm = XdsListenerResource.parseHttpConnectionManager( io.grpc.xds.HttpConnectionManager parsedHcm = XdsListenerResource.parseHttpConnectionManager(
HttpConnectionManager.newBuilder().setRouteConfig(routeConfig).build(), filterRegistry, HttpConnectionManager.newBuilder().setRouteConfig(routeConfig)
false /* parseHttpFilter */, true /* does not matter */); .addHttpFilters(
HttpFilter.newBuilder().setName("terminal").setTypedConfig(
Any.pack(Router.newBuilder().build())).setIsOptional(true))
.build(), filterRegistry,
true /* does not matter */);
// Verify that the only route left is the one with the registered RLS plugin `rls-plugin-1`, // Verify that the only route left is the one with the registered RLS plugin `rls-plugin-1`,
// while the route with unregistered optional `optional-plugin-`1 has been skipped. // while the route with unregistered optional `optional-plugin-`1 has been skipped.
@ -1731,9 +1738,12 @@ public class XdsClientImplDataTest {
.setRouteConfigName("rds-config-foo") .setRouteConfigName("rds-config-foo")
.setConfigSource( .setConfigSource(
ConfigSource.newBuilder().setAds(AggregatedConfigSource.getDefaultInstance()))) ConfigSource.newBuilder().setAds(AggregatedConfigSource.getDefaultInstance())))
.addHttpFilters(
HttpFilter.newBuilder().setName("terminal").setTypedConfig(
Any.pack(Router.newBuilder().build())).setIsOptional(true))
.build(); .build();
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm1, filterRegistry, false /* parseHttpFilter */, hcm1, filterRegistry,
true /* does not matter */); true /* does not matter */);
HttpConnectionManager hcm2 = HttpConnectionManager hcm2 =
@ -1742,9 +1752,12 @@ public class XdsClientImplDataTest {
.setRouteConfigName("rds-config-foo") .setRouteConfigName("rds-config-foo")
.setConfigSource( .setConfigSource(
ConfigSource.newBuilder().setSelf(SelfConfigSource.getDefaultInstance()))) ConfigSource.newBuilder().setSelf(SelfConfigSource.getDefaultInstance())))
.addHttpFilters(
HttpFilter.newBuilder().setName("terminal").setTypedConfig(
Any.pack(Router.newBuilder().build())).setIsOptional(true))
.build(); .build();
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm2, filterRegistry, false /* parseHttpFilter */, hcm2, filterRegistry,
true /* does not matter */); true /* does not matter */);
HttpConnectionManager hcm3 = HttpConnectionManager hcm3 =
@ -1754,12 +1767,15 @@ public class XdsClientImplDataTest {
.setConfigSource( .setConfigSource(
ConfigSource.newBuilder() ConfigSource.newBuilder()
.setPathConfigSource(PathConfigSource.newBuilder().setPath("foo-path")))) .setPathConfigSource(PathConfigSource.newBuilder().setPath("foo-path"))))
.addHttpFilters(
HttpFilter.newBuilder().setName("terminal").setTypedConfig(
Any.pack(Router.newBuilder().build())).setIsOptional(true))
.build(); .build();
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage( thrown.expectMessage(
"HttpConnectionManager contains invalid RDS: must specify ADS or self ConfigSource"); "HttpConnectionManager contains invalid RDS: must specify ADS or self ConfigSource");
XdsListenerResource.parseHttpConnectionManager( XdsListenerResource.parseHttpConnectionManager(
hcm3, filterRegistry, false /* parseHttpFilter */, hcm3, filterRegistry,
true /* does not matter */); true /* does not matter */);
} }
@ -2117,7 +2133,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("Listener listener1 with invalid traffic direction: OUTBOUND"); thrown.expectMessage("Listener listener1 with invalid traffic direction: OUTBOUND");
XdsListenerResource.parseServerSideListener( XdsListenerResource.parseServerSideListener(
listener, null, filterRegistry, null, true /* does not matter */); listener, null, filterRegistry, null);
} }
@Test @Test
@ -2127,7 +2143,7 @@ public class XdsClientImplDataTest {
.setName("listener1") .setName("listener1")
.build(); .build();
XdsListenerResource.parseServerSideListener( XdsListenerResource.parseServerSideListener(
listener, null, filterRegistry, null, true /* does not matter */); listener, null, filterRegistry, null);
} }
@Test @Test
@ -2141,7 +2157,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("Listener listener1 cannot have listener_filters"); thrown.expectMessage("Listener listener1 cannot have listener_filters");
XdsListenerResource.parseServerSideListener( XdsListenerResource.parseServerSideListener(
listener, null, filterRegistry, null, true /* does not matter */); listener, null, filterRegistry, null);
} }
@Test @Test
@ -2155,7 +2171,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("Listener listener1 cannot have use_original_dst set to true"); thrown.expectMessage("Listener listener1 cannot have use_original_dst set to true");
XdsListenerResource.parseServerSideListener( XdsListenerResource.parseServerSideListener(
listener,null, filterRegistry, null, true /* does not matter */); listener,null, filterRegistry, null);
} }
@Test @Test
@ -2204,7 +2220,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("FilterChainMatch must be unique. Found duplicate:"); thrown.expectMessage("FilterChainMatch must be unique. Found duplicate:");
XdsListenerResource.parseServerSideListener( XdsListenerResource.parseServerSideListener(
listener, null, filterRegistry, null, true /* does not matter */); listener, null, filterRegistry, null);
} }
@Test @Test
@ -2253,7 +2269,7 @@ public class XdsClientImplDataTest {
thrown.expect(ResourceInvalidException.class); thrown.expect(ResourceInvalidException.class);
thrown.expectMessage("FilterChainMatch must be unique. Found duplicate:"); thrown.expectMessage("FilterChainMatch must be unique. Found duplicate:");
XdsListenerResource.parseServerSideListener( XdsListenerResource.parseServerSideListener(
listener,null, filterRegistry, null, true /* does not matter */); listener,null, filterRegistry, null);
} }
@Test @Test
@ -2302,7 +2318,7 @@ public class XdsClientImplDataTest {
.addAllFilterChains(Arrays.asList(filterChain1, filterChain2)) .addAllFilterChains(Arrays.asList(filterChain1, filterChain2))
.build(); .build();
XdsListenerResource.parseServerSideListener( XdsListenerResource.parseServerSideListener(
listener, null, filterRegistry, null, true /* does not matter */); listener, null, filterRegistry, null);
} }
@Test @Test
@ -2317,8 +2333,7 @@ public class XdsClientImplDataTest {
thrown.expectMessage( thrown.expectMessage(
"FilterChain filter-chain-foo should contain exact one HttpConnectionManager filter"); "FilterChain filter-chain-foo should contain exact one HttpConnectionManager filter");
XdsListenerResource.parseFilterChain( XdsListenerResource.parseFilterChain(
filterChain, null, filterRegistry, null, null, filterChain, null, filterRegistry, null, null);
true /* does not matter */);
} }
@Test @Test
@ -2336,8 +2351,7 @@ public class XdsClientImplDataTest {
thrown.expectMessage( thrown.expectMessage(
"FilterChain filter-chain-foo should contain exact one HttpConnectionManager filter"); "FilterChain filter-chain-foo should contain exact one HttpConnectionManager filter");
XdsListenerResource.parseFilterChain( XdsListenerResource.parseFilterChain(
filterChain, null, filterRegistry, null, null, filterChain, null, filterRegistry, null, null);
true /* does not matter */);
} }
@Test @Test
@ -2355,8 +2369,7 @@ public class XdsClientImplDataTest {
"FilterChain filter-chain-foo contains filter envoy.http_connection_manager " "FilterChain filter-chain-foo contains filter envoy.http_connection_manager "
+ "without typed_config"); + "without typed_config");
XdsListenerResource.parseFilterChain( XdsListenerResource.parseFilterChain(
filterChain, null, filterRegistry, null, null, filterChain, null, filterRegistry, null, null);
true /* does not matter */);
} }
@Test @Test
@ -2378,8 +2391,7 @@ public class XdsClientImplDataTest {
"FilterChain filter-chain-foo contains filter unsupported with unsupported " "FilterChain filter-chain-foo contains filter unsupported with unsupported "
+ "typed_config type unsupported-type-url"); + "typed_config type unsupported-type-url");
XdsListenerResource.parseFilterChain( XdsListenerResource.parseFilterChain(
filterChain, null, filterRegistry, null, null, filterChain, null, filterRegistry, null, null);
true /* does not matter */);
} }
@Test @Test
@ -2407,10 +2419,10 @@ public class XdsClientImplDataTest {
EnvoyServerProtoData.FilterChain parsedFilterChain1 = XdsListenerResource.parseFilterChain( EnvoyServerProtoData.FilterChain parsedFilterChain1 = XdsListenerResource.parseFilterChain(
filterChain1, null, filterRegistry, null, filterChain1, null, filterRegistry, null,
null, true /* does not matter */); null);
EnvoyServerProtoData.FilterChain parsedFilterChain2 = XdsListenerResource.parseFilterChain( EnvoyServerProtoData.FilterChain parsedFilterChain2 = XdsListenerResource.parseFilterChain(
filterChain2, null, filterRegistry, null, filterChain2, null, filterRegistry, null,
null, true /* does not matter */); null);
assertThat(parsedFilterChain1.name()).isEqualTo(parsedFilterChain2.name()); assertThat(parsedFilterChain1.name()).isEqualTo(parsedFilterChain2.name());
} }

View File

@ -283,8 +283,6 @@ public abstract class XdsClientImplTestBase {
private ManagedChannel channelForCustomAuthority; private ManagedChannel channelForCustomAuthority;
private ManagedChannel channelForEmptyAuthority; private ManagedChannel channelForEmptyAuthority;
private XdsClientImpl xdsClient; private XdsClientImpl xdsClient;
private boolean originalEnableFaultInjection;
private boolean originalEnableRbac;
private boolean originalEnableLeastRequest; private boolean originalEnableLeastRequest;
private boolean originalEnableFederation; private boolean originalEnableFederation;
private Server xdsServer; private Server xdsServer;
@ -301,10 +299,6 @@ public abstract class XdsClientImplTestBase {
when(backoffPolicy2.nextBackoffNanos()).thenReturn(20L, 200L); when(backoffPolicy2.nextBackoffNanos()).thenReturn(20L, 200L);
// Start the server and the client. // Start the server and the client.
originalEnableFaultInjection = XdsResourceType.enableFaultInjection;
XdsResourceType.enableFaultInjection = true;
originalEnableRbac = XdsResourceType.enableRbac;
assertThat(originalEnableRbac).isTrue();
originalEnableLeastRequest = XdsResourceType.enableLeastRequest; originalEnableLeastRequest = XdsResourceType.enableLeastRequest;
XdsResourceType.enableLeastRequest = true; XdsResourceType.enableLeastRequest = true;
originalEnableFederation = BootstrapperImpl.enableFederation; originalEnableFederation = BootstrapperImpl.enableFederation;
@ -380,8 +374,6 @@ public abstract class XdsClientImplTestBase {
@After @After
public void tearDown() { public void tearDown() {
XdsResourceType.enableFaultInjection = originalEnableFaultInjection;
XdsResourceType.enableRbac = originalEnableRbac;
XdsResourceType.enableLeastRequest = originalEnableLeastRequest; XdsResourceType.enableLeastRequest = originalEnableLeastRequest;
BootstrapperImpl.enableFederation = originalEnableFederation; BootstrapperImpl.enableFederation = originalEnableFederation;
xdsClient.shutdown(); xdsClient.shutdown();
@ -2255,8 +2247,6 @@ public abstract class XdsClientImplTestBase {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void cdsResponseWithOutlierDetection() { public void cdsResponseWithOutlierDetection() {
Assume.assumeTrue(useProtocolV3()); Assume.assumeTrue(useProtocolV3());
XdsClusterResource.enableOutlierDetection = true;
DiscoveryRpcCall call = startResourceWatcher(XdsClusterResource.getInstance(), CDS_RESOURCE, DiscoveryRpcCall call = startResourceWatcher(XdsClusterResource.getInstance(), CDS_RESOURCE,
cdsResourceWatcher); cdsResourceWatcher);
@ -2320,46 +2310,6 @@ public abstract class XdsClientImplTestBase {
verifySubscribedResourcesMetadataSizes(0, 1, 0, 0); verifySubscribedResourcesMetadataSizes(0, 1, 0, 0);
} }
/**
* CDS response containing OutlierDetection for a cluster, but support has not been enabled.
*/
@Test
@SuppressWarnings("deprecation")
public void cdsResponseWithOutlierDetection_supportDisabled() {
Assume.assumeTrue(useProtocolV3());
XdsClusterResource.enableOutlierDetection = false;
DiscoveryRpcCall call = startResourceWatcher(XdsClusterResource.getInstance(), CDS_RESOURCE,
cdsResourceWatcher);
OutlierDetection outlierDetectionXds = OutlierDetection.newBuilder()
.setInterval(Durations.fromNanos(100)).build();
// Management server sends back CDS response with UpstreamTlsContext.
Any clusterEds =
Any.pack(mf.buildEdsCluster(CDS_RESOURCE, "eds-cluster-foo.googleapis.com", "round_robin",
null, null, true,
mf.buildUpstreamTlsContext("cert-instance-name", "cert1"),
"envoy.transport_sockets.tls", null, outlierDetectionXds));
List<Any> clusters = ImmutableList.of(
Any.pack(mf.buildLogicalDnsCluster("cluster-bar.googleapis.com",
"dns-service-bar.googleapis.com", 443, "round_robin", null, null,false, null, null)),
clusterEds,
Any.pack(mf.buildEdsCluster("cluster-baz.googleapis.com", null, "round_robin", null, null,
false, null, "envoy.transport_sockets.tls", null, outlierDetectionXds)));
call.sendResponse(CDS, clusters, VERSION_1, "0000");
// Client sent an ACK CDS request.
call.verifyRequest(CDS, CDS_RESOURCE, VERSION_1, "0000", NODE);
verify(cdsResourceWatcher, times(1)).onChanged(cdsUpdateCaptor.capture());
CdsUpdate cdsUpdate = cdsUpdateCaptor.getValue();
assertThat(cdsUpdate.outlierDetection()).isNull();
verifyResourceMetadataAcked(CDS, CDS_RESOURCE, clusterEds, VERSION_1, TIME_INCREMENT);
verifySubscribedResourcesMetadataSizes(0, 1, 0, 0);
}
/** /**
* CDS response containing OutlierDetection for a cluster. * CDS response containing OutlierDetection for a cluster.
*/ */
@ -2367,7 +2317,6 @@ public abstract class XdsClientImplTestBase {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public void cdsResponseWithInvalidOutlierDetectionNacks() { public void cdsResponseWithInvalidOutlierDetectionNacks() {
Assume.assumeTrue(useProtocolV3()); Assume.assumeTrue(useProtocolV3());
XdsClusterResource.enableOutlierDetection = true;
DiscoveryRpcCall call = startResourceWatcher(XdsClusterResource.getInstance(), CDS_RESOURCE, DiscoveryRpcCall call = startResourceWatcher(XdsClusterResource.getInstance(), CDS_RESOURCE,
cdsResourceWatcher); cdsResourceWatcher);