Skip to content

Commit 71a10dc

Browse files
Ext_proc filter and client interceptor (grpc#12792)
Implements ext_proc filter from [grfc A93](grpc/proposal#484) (internal [design doc](http://go/ext-proc-design-java)).
1 parent c88285f commit 71a10dc

33 files changed

Lines changed: 19261 additions & 131 deletions

xds/src/generated/thirdparty/grpc/io/envoyproxy/envoy/service/ext_proc/v3/ExternalProcessorGrpc.java

Lines changed: 522 additions & 0 deletions
Large diffs are not rendered by default.

xds/src/main/java/io/grpc/xds/ExternalProcessorClientInterceptor.java

Lines changed: 1638 additions & 0 deletions
Large diffs are not rendered by default.

xds/src/main/java/io/grpc/xds/ExternalProcessorFilter.java

Lines changed: 447 additions & 0 deletions
Large diffs are not rendered by default.

xds/src/main/java/io/grpc/xds/FaultFilter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
import io.grpc.internal.GrpcUtil;
4646
import io.grpc.xds.FaultConfig.FaultAbort;
4747
import io.grpc.xds.FaultConfig.FaultDelay;
48+
import io.grpc.xds.Filter.FilterConfigParseContext;
49+
import io.grpc.xds.Filter.FilterContext;
4850
import io.grpc.xds.ThreadSafeRandom.ThreadSafeRandomImpl;
4951
import java.util.Locale;
5052
import java.util.concurrent.Executor;
@@ -99,7 +101,7 @@ public boolean isClientFilter() {
99101
}
100102

101103
@Override
102-
public FaultFilter newInstance(String name) {
104+
public FaultFilter newInstance(FilterContext context) {
103105
return INSTANCE;
104106
}
105107

xds/src/main/java/io/grpc/xds/Filter.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.google.common.base.MoreObjects;
2222
import com.google.protobuf.Message;
2323
import io.grpc.ClientInterceptor;
24+
import io.grpc.MetricRecorder;
2425
import io.grpc.ServerInterceptor;
2526
import io.grpc.xds.client.Bootstrapper.BootstrapInfo;
2627
import io.grpc.xds.client.Bootstrapper.ServerInfo;
@@ -91,7 +92,7 @@ default boolean isServerFilter() {
9192
* <li>Filter name+typeUrl in FilterChain's HCM.http_filters.</li>
9293
* </ol>
9394
*/
94-
Filter newInstance(String name);
95+
Filter newInstance(FilterContext context);
9596

9697
/**
9798
* Parses the top-level filter config from raw proto message. The message may be either a {@link
@@ -152,6 +153,18 @@ abstract static class Builder {
152153
}
153154
}
154155

156+
/** Context containing naming and metrics reporting objects for a filter instance. */
157+
@AutoValue
158+
abstract static class FilterContext {
159+
abstract String filterName();
160+
161+
abstract MetricRecorder metricsRecorder();
162+
163+
static FilterContext create(String filterName, MetricRecorder metricsRecorder) {
164+
return new AutoValue_Filter_FilterContext(filterName, metricsRecorder);
165+
}
166+
}
167+
155168
/** Filter config with instance name. */
156169
final class NamedFilterConfig {
157170
// filter instance name

xds/src/main/java/io/grpc/xds/FilterRegistry.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,17 @@ static synchronized FilterRegistry getDefaultRegistry() {
3838
new FaultFilter.Provider(),
3939
new RouterFilter.Provider(),
4040
new RbacFilter.Provider(),
41-
new GcpAuthenticationFilter.Provider());
41+
new GcpAuthenticationFilter.Provider(),
42+
new ExternalProcessorFilter.Provider());
4243
}
4344
return instance;
4445
}
4546

47+
@VisibleForTesting
48+
static synchronized void reset() {
49+
instance = null;
50+
}
51+
4652
@VisibleForTesting
4753
static FilterRegistry newRegistry() {
4854
return new FilterRegistry();

xds/src/main/java/io/grpc/xds/GcpAuthenticationFilter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import io.grpc.Status;
4242
import io.grpc.StatusOr;
4343
import io.grpc.auth.MoreCallCredentials;
44+
import io.grpc.xds.Filter.FilterConfigParseContext;
45+
import io.grpc.xds.Filter.FilterContext;
4446
import io.grpc.xds.GcpAuthenticationFilter.AudienceMetadataParser.AudienceWrapper;
4547
import io.grpc.xds.MetadataRegistry.MetadataValueParser;
4648
import io.grpc.xds.XdsConfig.XdsClusterConfig;
@@ -81,8 +83,8 @@ public boolean isClientFilter() {
8183
}
8284

8385
@Override
84-
public GcpAuthenticationFilter newInstance(String name) {
85-
return new GcpAuthenticationFilter(name, cacheSize);
86+
public GcpAuthenticationFilter newInstance(FilterContext context) {
87+
return new GcpAuthenticationFilter(context.filterName(), cacheSize);
8688
}
8789

8890
@Override

xds/src/main/java/io/grpc/xds/GrpcServiceConfigParser.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,14 @@ public static GrpcServiceConfig parse(GrpcService grpcServiceProto,
9898
.getInitialMetadataList()) {
9999
String key = header.getKey();
100100
HeaderValue headerValue;
101-
if (key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) {
102-
headerValue = HeaderValue.create(key, header.getRawValue());
103-
} else {
104-
headerValue = HeaderValue.create(key, header.getValue());
101+
try {
102+
if (key.endsWith(Metadata.BINARY_HEADER_SUFFIX)) {
103+
headerValue = HeaderValue.create(key, header.getRawValue());
104+
} else {
105+
headerValue = HeaderValue.create(key, header.getValue());
106+
}
107+
} catch (IllegalArgumentException e) {
108+
throw new GrpcServiceParseException("Invalid initial metadata header: " + key, e);
105109
}
106110
if (HeaderValueValidationUtils.isDisallowed(headerValue)) {
107111
throw new GrpcServiceParseException("Invalid initial metadata header: " + key);

xds/src/main/java/io/grpc/xds/InternalRbacFilter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.envoyproxy.envoy.extensions.filters.http.rbac.v3.RBAC;
2020
import io.grpc.Internal;
2121
import io.grpc.ServerInterceptor;
22+
import io.grpc.xds.Filter.FilterContext;
2223

2324
/** This class exposes some functionality in RbacFilter to other packages. */
2425
@Internal
@@ -33,7 +34,8 @@ public static ServerInterceptor createInterceptor(RBAC rbac) {
3334
throw new IllegalArgumentException(
3435
String.format("Failed to parse Rbac policy: %s", filterConfig.errorDetail));
3536
}
36-
return new RbacFilter.Provider().newInstance("internalRbacFilter")
37+
return new RbacFilter.Provider().newInstance(
38+
FilterContext.create("internalRbacFilter", new io.grpc.MetricRecorder() {}))
3739
.buildServerInterceptor(filterConfig.config, null);
3840
}
3941
}

xds/src/main/java/io/grpc/xds/RbacFilter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import io.grpc.ServerCallHandler;
3434
import io.grpc.ServerInterceptor;
3535
import io.grpc.Status;
36+
import io.grpc.xds.Filter.FilterConfigParseContext;
37+
import io.grpc.xds.Filter.FilterContext;
3638
import io.grpc.xds.internal.MatcherParser;
3739
import io.grpc.xds.internal.Matchers;
3840
import io.grpc.xds.internal.rbac.engine.GrpcAuthorizationEngine;
@@ -89,7 +91,7 @@ public boolean isServerFilter() {
8991
}
9092

9193
@Override
92-
public RbacFilter newInstance(String name) {
94+
public RbacFilter newInstance(FilterContext context) {
9395
return INSTANCE;
9496
}
9597

0 commit comments

Comments
 (0)