xds: Return a null RouteAction when cluster has no cluster_specifier or route lookup is not enabled with a cluster_specifier_plugin.

We want to ignore the route in these situations, which is achieved by returning a null. The current behavior of returning an error triggers a NACK to the update.
This commit is contained in:
Terry Wilson 2022-03-23 14:44:43 -07:00 committed by Terry Wilson
parent 700afafb10
commit 6c00f0052f
2 changed files with 27 additions and 3 deletions

View File

@ -1340,12 +1340,11 @@ final class ClientXdsClient extends XdsClient implements XdsResponseHandler, Res
return StructOrError.fromStruct(RouteAction.forClusterSpecifierPlugin(
namedPluginConfig, hashPolicies, timeoutNano, retryPolicy));
} else {
return StructOrError.fromError("Support for ClusterSpecifierPlugin not enabled");
return null;
}
case CLUSTERSPECIFIER_NOT_SET:
default:
return StructOrError.fromError(
"Unknown cluster specifier: " + proto.getClusterSpecifierCase());
return null;
}
}

View File

@ -17,6 +17,7 @@
package io.grpc.xds;
import static com.google.common.truth.Truth.assertThat;
import static io.envoyproxy.envoy.config.route.v3.RouteAction.ClusterSpecifierCase.CLUSTER_SPECIFIER_PLUGIN;
import com.github.udpa.udpa.type.v1.TypedStruct;
import com.google.common.collect.ImmutableMap;
@ -801,6 +802,30 @@ public class ClientXdsClientDataTest {
assertThat(policies.get(1).isTerminal()).isFalse();
}
@Test
public void parseRouteAction_clusterSpecifier_routeLookupDisabled() {
ClientXdsClient.enableRouteLookup = false;
io.envoyproxy.envoy.config.route.v3.RouteAction proto =
io.envoyproxy.envoy.config.route.v3.RouteAction.newBuilder()
.setClusterSpecifierPlugin(CLUSTER_SPECIFIER_PLUGIN.name())
.build();
StructOrError<RouteAction> struct =
ClientXdsClient.parseRouteAction(proto, filterRegistry, false,
ImmutableMap.<String, PluginConfig>of());
assertThat(struct).isNull();
}
@Test
public void parseRouteAction_custerSpecifierNotSet() {
io.envoyproxy.envoy.config.route.v3.RouteAction proto =
io.envoyproxy.envoy.config.route.v3.RouteAction.newBuilder()
.build();
StructOrError<RouteAction> struct =
ClientXdsClient.parseRouteAction(proto, filterRegistry, false,
ImmutableMap.<String, PluginConfig>of());
assertThat(struct).isNull();
}
@Test
public void parseClusterWeight() {
io.envoyproxy.envoy.config.route.v3.WeightedCluster.ClusterWeight proto =