22
33import static com .google .common .base .Preconditions .checkNotNull ;
44
5- import com .google .common .annotations .VisibleForTesting ;
65import com .google .common .io .ByteStreams ;
76import com .google .protobuf .Any ;
87import com .google .protobuf .InvalidProtocolBufferException ;
98import com .google .protobuf .Message ;
109import io .envoyproxy .envoy .config .core .v3 .GrpcService ;
11- import io .envoyproxy .envoy .config .core .v3 .HeaderValueOption ;
1210import io .envoyproxy .envoy .extensions .filters .http .ext_proc .v3 .ExternalProcessor ;
1311import io .envoyproxy .envoy .extensions .filters .http .ext_proc .v3 .ProcessingMode ;
1412import io .envoyproxy .envoy .service .ext_proc .v3 .ExternalProcessorGrpc ;
2624import io .grpc .MethodDescriptor ;
2725import io .grpc .Status ;
2826import io .grpc .stub .ClientCallStreamObserver ;
29- import io .grpc .xds .internal .grpcservice .GrpcServiceChannelCreator ;
30- import io .grpc .xds .internal .grpcservice .GrpcServiceChannelCreatorImpl ;
27+ import io .grpc .xds .internal .grpcservice .CachedChannelManager ;
28+ import io .grpc .xds .internal .grpcservice .GrpcServiceConfig ;
29+ import io .grpc .xds .internal .grpcservice .GrpcServiceConfigParser ;
30+ import io .grpc .xds .internal .grpcservice .GrpcServiceParseException ;
31+ import io .grpc .xds .internal .grpcservice .GrpcServiceXdsContextProvider ;
3132import java .io .ByteArrayInputStream ;
3233import java .io .IOException ;
3334import java .io .InputStream ;
@@ -39,19 +40,16 @@ public class ExternalProcessorFilter implements Filter {
3940 static final String TYPE_URL = "type.googleapis.com/envoy.extensions.filters.http.ext_proc.v3.ExternalProcessor" ;
4041
4142 final String filterInstanceName ;
42- // TODO: Make final after the need to replace with a mock from unit tests is removed.
43- GrpcServiceChannelCreator grpcServiceChannelCreator ;
4443 ManagedChannel grpcServiceChannel ;
4544 ExternalProcessorGrpc .ExternalProcessorStub externalProcessorStub ;
4645 private final Object lock = new Object ();
47- private GrpcService lastGrpcServiceConfig ;
4846
4947 public ExternalProcessorFilter (String name ) {
5048 filterInstanceName = checkNotNull (name , "name" );
51- grpcServiceChannelCreator = new GrpcServiceChannelCreatorImpl ();
5249 }
5350
5451 static final class Provider implements Filter .Provider {
52+ private GrpcServiceXdsContextProvider grpcServiceXdsContextProvider ;
5553 @ Override
5654 public String [] typeUrls () {
5755 return new String []{TYPE_URL };
@@ -63,7 +61,8 @@ public boolean isClientFilter() {
6361 }
6462
6563 @ Override
66- public ExternalProcessorFilter newInstance (String name ) {
64+ public ExternalProcessorFilter newInstance (String name , GrpcServiceXdsContextProvider grpcServiceXdsContextProvider ) {
65+ this .grpcServiceXdsContextProvider = grpcServiceXdsContextProvider ;
6766 return new ExternalProcessorFilter (name );
6867 }
6968
@@ -87,7 +86,12 @@ public ConfigOrError<ExternalProcessorFilterConfig> parseFilterConfig(Message ra
8786 return ConfigOrError .fromError ("Invalid response_body_mode: " + mode .getResponseBodyMode () + ". Only GRPC is supported." );
8887 }
8988
90- return ConfigOrError .fromConfig (new ExternalProcessorFilterConfig (externalProcessor ));
89+ try {
90+ GrpcServiceConfig grpcServiceConfig = GrpcServiceConfigParser .parse (externalProcessor .getGrpcService (), grpcServiceXdsContextProvider );
91+ return ConfigOrError .fromConfig (new ExternalProcessorFilterConfig (externalProcessor , grpcServiceConfig ));
92+ } catch (GrpcServiceParseException e ) {
93+ return ConfigOrError .fromError ("Error parsing GrpcService config: " + e .getMessage ());
94+ }
9195 }
9296
9397 @ Override
@@ -103,31 +107,14 @@ public ClientInterceptor buildClientInterceptor(FilterConfig filterConfig,
103107 return new ExternalProcessorInterceptor (this , (ExternalProcessorFilterConfig ) filterConfig , overrideConfig , scheduler );
104108 }
105109
106- ExternalProcessorGrpc .ExternalProcessorStub getExternalProcessorStub (ExternalProcessor config ) {
107- GrpcService newServiceConfig = config .getGrpcService ();
108- synchronized (lock ) {
109- // TODO: gRFC only mentions we should recreate channel if target or channel creds changed
110- // but other fields in grpc service config also do seem relevant to warrant channel
111- // recreation.
112- if (grpcServiceChannel == null || !newServiceConfig .equals (lastGrpcServiceConfig )) {
113- if (grpcServiceChannel != null ) {
114- // Shutdown the old channel if the config has changed
115- grpcServiceChannel .shutdown ();
116- }
117- grpcServiceChannel = grpcServiceChannelCreator .create (newServiceConfig );
118- externalProcessorStub = ExternalProcessorGrpc .newStub (grpcServiceChannel );
119- lastGrpcServiceConfig = newServiceConfig ;
120- }
121- return externalProcessorStub ;
122- }
123- }
124-
125110 static final class ExternalProcessorFilterConfig implements FilterConfig {
126111
127112 private final ExternalProcessor externalProcessor ;
113+ private final GrpcServiceConfig grpcServiceConfig ;
128114
129- ExternalProcessorFilterConfig (ExternalProcessor externalProcessor ) {
115+ ExternalProcessorFilterConfig (ExternalProcessor externalProcessor , GrpcServiceConfig grpcServiceConfig ) {
130116 this .externalProcessor = externalProcessor ;
117+ this .grpcServiceConfig = grpcServiceConfig ;
131118 }
132119
133120 @ Override
@@ -137,6 +124,7 @@ public String typeUrl() {
137124 }
138125
139126 static final class ExternalProcessorInterceptor implements ClientInterceptor {
127+ private final CachedChannelManager cachedChannelManager = new CachedChannelManager ();
140128 private final ExternalProcessorFilter filter ;
141129 private final ExternalProcessorFilterConfig filterConfig ;
142130 private final FilterConfig overrideConfig ;
@@ -164,7 +152,8 @@ public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
164152 MethodDescriptor <ReqT , RespT > method ,
165153 CallOptions callOptions ,
166154 Channel next ) {
167- ExternalProcessorGrpc .ExternalProcessorStub stub = filter .getExternalProcessorStub (filterConfig .externalProcessor );
155+ ExternalProcessorGrpc .ExternalProcessorStub stub = ExternalProcessorGrpc .newStub (
156+ cachedChannelManager .getChannel (filterConfig .grpcServiceConfig ));
168157 ExternalProcessor config = filterConfig .externalProcessor ;
169158
170159 MethodDescriptor <InputStream , InputStream > rawMethod = method .toBuilder (RAW_MARSHALLER , RAW_MARSHALLER ).build ();
0 commit comments