@@ -96,6 +96,10 @@ final class ClientXdsClient extends AbstractXdsClient {
9696 @ VisibleForTesting
9797 static final String AGGREGATE_CLUSTER_TYPE_NAME = "envoy.clusters.aggregate" ;
9898 private static final String HTTP_FAULT_FILTER_NAME = "envoy.fault" ;
99+ @ VisibleForTesting
100+ static boolean enableFaultInjection =
101+ Boolean .parseBoolean (System .getenv ("GRPC_XDS_EXPERIMENTAL_FAULT_INJECTION" ));
102+
99103 private static final String TYPE_URL_HTTP_CONNECTION_MANAGER_V2 =
100104 "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2"
101105 + ".HttpConnectionManager" ;
@@ -184,22 +188,26 @@ protected void handleLdsResponse(String versionInfo, List<Any> resources, String
184188 }
185189 boolean hasFaultInjection = false ;
186190 HttpFault httpFault = null ;
187- List <HttpFilter > httpFilters = hcm .getHttpFiltersList ();
188- for (HttpFilter httpFilter : httpFilters ) {
189- if (HTTP_FAULT_FILTER_NAME .equals (httpFilter .getName ())) {
190- hasFaultInjection = true ;
191- if (httpFilter .hasTypedConfig ()) {
192- StructOrError <HttpFault > httpFaultOrError =
193- decodeFaultFilterConfig (httpFilter .getTypedConfig ());
194- if (httpFaultOrError .getErrorDetail () != null ) {
195- nackResponse (ResourceType .LDS , nonce ,
196- "Listener " + listenerName + " contains invalid HttpFault filter: "
197- + httpFaultOrError .getErrorDetail ());
198- return ;
191+ if (enableFaultInjection ) {
192+ List <HttpFilter > httpFilters = hcm .getHttpFiltersList ();
193+ for (HttpFilter httpFilter : httpFilters ) {
194+ if (HTTP_FAULT_FILTER_NAME .equals (httpFilter .getName ())) {
195+ hasFaultInjection = true ;
196+ if (httpFilter .hasTypedConfig ()) {
197+ StructOrError <HttpFault > httpFaultOrError =
198+ decodeFaultFilterConfig (httpFilter .getTypedConfig ());
199+ if (httpFaultOrError != null ) {
200+ if (httpFaultOrError .getErrorDetail () != null ) {
201+ nackResponse (ResourceType .LDS , nonce ,
202+ "Listener " + listenerName + " contains invalid HttpFault filter: "
203+ + httpFaultOrError .getErrorDetail ());
204+ return ;
205+ }
206+ httpFault = httpFaultOrError .getStruct ();
207+ }
199208 }
200- httpFault = httpFaultOrError . getStruct () ;
209+ break ;
201210 }
202- break ;
203211 }
204212 }
205213 if (hcm .hasRouteConfig ()) {
@@ -271,12 +279,14 @@ private static StructOrError<VirtualHost> parseVirtualHost(
271279 if (filterConfigMap .containsKey (HTTP_FAULT_FILTER_NAME )) {
272280 Any rawFaultFilterConfig = filterConfigMap .get (HTTP_FAULT_FILTER_NAME );
273281 StructOrError <HttpFault > httpFaultOrError = decodeFaultFilterConfig (rawFaultFilterConfig );
274- if (httpFaultOrError .getErrorDetail () != null ) {
275- return StructOrError .fromError (
276- "Virtual host [" + name + "] contains invalid HttpFault filter : "
277- + httpFaultOrError .getErrorDetail ());
282+ if (httpFaultOrError != null ) {
283+ if (httpFaultOrError .getErrorDetail () != null ) {
284+ return StructOrError .fromError (
285+ "Virtual host [" + name + "] contains invalid HttpFault filter : "
286+ + httpFaultOrError .getErrorDetail ());
287+ }
288+ httpFault = httpFaultOrError .getStruct ();
278289 }
279- httpFault = httpFaultOrError .getStruct ();
280290 }
281291 return StructOrError .fromStruct (VirtualHost .create (
282292 name , proto .getDomainsList (), routes , httpFault ));
@@ -322,12 +332,14 @@ static StructOrError<Route> parseRoute(io.envoyproxy.envoy.config.route.v3.Route
322332 if (filterConfigMap .containsKey (HTTP_FAULT_FILTER_NAME )) {
323333 Any rawFaultFilterConfig = filterConfigMap .get (HTTP_FAULT_FILTER_NAME );
324334 StructOrError <HttpFault > httpFaultOrError = decodeFaultFilterConfig (rawFaultFilterConfig );
325- if (httpFaultOrError .getErrorDetail () != null ) {
326- return StructOrError .fromError (
327- "Route [" + proto .getName () + "] contains invalid HttpFault filter: "
328- + httpFaultOrError .getErrorDetail ());
335+ if (httpFaultOrError != null ) {
336+ if (httpFaultOrError .getErrorDetail () != null ) {
337+ return StructOrError .fromError (
338+ "Route [" + proto .getName () + "] contains invalid HttpFault filter: "
339+ + httpFaultOrError .getErrorDetail ());
340+ }
341+ httpFault = httpFaultOrError .getStruct ();
329342 }
330- httpFault = httpFaultOrError .getStruct ();
331343 }
332344 return StructOrError .fromStruct (Route .create (
333345 routeMatch .getStruct (), routeAction .getStruct (), httpFault ));
@@ -508,22 +520,24 @@ static StructOrError<ClusterWeight> parseClusterWeight(
508520 if (filterConfigMap .containsKey (HTTP_FAULT_FILTER_NAME )) {
509521 Any rawFaultFilterConfig = filterConfigMap .get (HTTP_FAULT_FILTER_NAME );
510522 StructOrError <HttpFault > httpFaultOrError = decodeFaultFilterConfig (rawFaultFilterConfig );
511- if (httpFaultOrError .getErrorDetail () != null ) {
512- return StructOrError .fromError (
513- "ClusterWeight [" + proto .getName () + "] contains invalid HttpFault filter: "
514- + httpFaultOrError .getErrorDetail ());
523+ if (httpFaultOrError != null ) {
524+ if (httpFaultOrError .getErrorDetail () != null ) {
525+ return StructOrError .fromError (
526+ "ClusterWeight [" + proto .getName () + "] contains invalid HttpFault filter: "
527+ + httpFaultOrError .getErrorDetail ());
528+ }
529+ httpFault = httpFaultOrError .getStruct ();
515530 }
516- httpFault = httpFaultOrError .getStruct ();
517531 }
518532 return StructOrError .fromStruct (
519533 ClusterWeight .create (proto .getName (), proto .getWeight ().getValue (), httpFault ));
520534 }
521535
536+ @ Nullable
522537 private static StructOrError <HttpFault > decodeFaultFilterConfig (Any rawFaultFilterConfig ) {
523- if (rawFaultFilterConfig .getTypeUrl ().equals (
524- "type.googleapis.com/envoy.config.filter.http.fault.v2.HTTPFault" )) {
525- rawFaultFilterConfig = rawFaultFilterConfig .toBuilder ().setTypeUrl (
526- "type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault" ).build ();
538+ if (!rawFaultFilterConfig .getTypeUrl ().equals (
539+ "type.googleapis.com/envoy.extensions.filters.http.fault.v3.HTTPFault" )) {
540+ return null ;
527541 }
528542 HTTPFault httpFaultProto ;
529543 try {
0 commit comments