Skip to content

Commit 70ae8d0

Browse files
committed
use endpoint override.
1 parent e799526 commit 70ae8d0

File tree

8 files changed

+296
-40
lines changed

8 files changed

+296
-40
lines changed

gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProvider.java

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ public final class InstantiatingGrpcChannelProvider implements TransportChannelP
122122
private final HeaderProvider headerProvider;
123123
private final String endpoint;
124124
private final String mtlsEndpoint;
125+
private final String endpointOverride;
125126
// TODO: remove.
126127
// envProvider currently provides DirectPath and S2A environment variables, and is only used
127128
// during initial rollout for DirectPath and S2A. This provider will be removed once the
@@ -153,6 +154,7 @@ private InstantiatingGrpcChannelProvider(Builder builder) {
153154
this.headerProvider = builder.headerProvider;
154155
this.endpoint = builder.endpoint;
155156
this.mtlsEndpoint = builder.mtlsEndpoint;
157+
this.endpointOverride = builder.endpointOverride;
156158
this.mtlsProvider = builder.mtlsProvider;
157159
this.envProvider = builder.envProvider;
158160
this.interceptorProvider = builder.interceptorProvider;
@@ -228,10 +230,16 @@ public boolean needsEndpoint() {
228230
return endpoint == null;
229231
}
230232

233+
@Override
231234
public boolean needsMtlsEndpoint() {
232235
return mtlsEndpoint == null;
233236
}
234237

238+
@Override
239+
public boolean needsEndpointOverride() {
240+
return endpointOverride == null;
241+
}
242+
235243
/**
236244
* Specify the endpoint the channel should connect to.
237245
*
@@ -255,11 +263,31 @@ public TransportChannelProvider withEndpoint(String endpoint) {
255263
* @return A new {@link InstantiatingGrpcChannelProvider} with the specified MTLS endpoint
256264
* configured
257265
*/
266+
@Override
258267
public TransportChannelProvider withMtlsEndpoint(String mtlsEndpoint) {
259-
validateEndpoint(mtlsEndpoint);
268+
if (!mtlsEndpoint.isEmpty()) {
269+
validateEndpoint(mtlsEndpoint);
270+
}
260271
return toBuilder().setMtlsEndpoint(mtlsEndpoint).build();
261272
}
262273

274+
/**
275+
* Specify the endpoint override.
276+
*
277+
* <p>The value of {@code endpointOverride} must be of the form {@code host:port}.
278+
*
279+
* @param endpointOverride
280+
* @return A new {@link InstantiatingGrpcChannelProvider} with the specified endpoint Override
281+
* configured
282+
*/
283+
@Override
284+
public TransportChannelProvider withEndpointOverride(String endpointOverride) {
285+
if (!endpointOverride.isEmpty()) {
286+
validateEndpoint(endpointOverride);
287+
}
288+
return toBuilder().setEndpointOverride(endpointOverride).build();
289+
}
290+
263291
/** @deprecated Please modify pool settings via {@link #toBuilder()} */
264292
@Deprecated
265293
@Override
@@ -462,15 +490,13 @@ boolean shouldUseS2A() {
462490
return false;
463491
}
464492

465-
// If {@link mtlsEndpoint} is not set, skip S2A. S2A is also skipped when there is endpoint
466-
// override. Endpoint override is respected when the {@link endpoint} is resolved via AIP#4114,
467-
// see EndpointContext.java
468-
if (endpoint != mtlsEndpoint) {
493+
// If {@code mtlsEndpoint} is not set, or {@code endpointOverride} is specified, skip S2A.
494+
if (mtlsEndpoint.isEmpty() || !endpointOverride.isEmpty()) {
469495
return false;
470496
}
471497

472498
// mTLS via S2A is not supported in any universe other than googleapis.com.
473-
if (!endpoint.contains(Credentials.GOOGLE_DEFAULT_UNIVERSE)) {
499+
if (!mtlsEndpoint.contains(Credentials.GOOGLE_DEFAULT_UNIVERSE)) {
474500
return false;
475501
}
476502

@@ -686,6 +712,11 @@ public String getMtlsEndpoint() {
686712
return mtlsEndpoint;
687713
}
688714

715+
/** The endpoint override */
716+
public String getEndpointOverride() {
717+
return endpointOverride;
718+
}
719+
689720
/** This method is obsolete. Use {@link #getKeepAliveTimeDuration()} instead. */
690721
@ObsoleteApi("Use getKeepAliveTimeDuration() instead")
691722
public org.threeten.bp.Duration getKeepAliveTime() {
@@ -744,6 +775,7 @@ public static final class Builder {
744775
private HeaderProvider headerProvider;
745776
private String endpoint;
746777
private String mtlsEndpoint;
778+
private String endpointOverride;
747779
private EnvironmentProvider envProvider;
748780
private MtlsProvider mtlsProvider = new MtlsProvider();
749781
@Nullable private GrpcInterceptorProvider interceptorProvider;
@@ -773,6 +805,7 @@ private Builder(InstantiatingGrpcChannelProvider provider) {
773805
this.headerProvider = provider.headerProvider;
774806
this.endpoint = provider.endpoint;
775807
this.mtlsEndpoint = provider.mtlsEndpoint;
808+
this.endpointOverride = provider.endpointOverride;
776809
this.envProvider = provider.envProvider;
777810
this.interceptorProvider = provider.interceptorProvider;
778811
this.maxInboundMessageSize = provider.maxInboundMessageSize;
@@ -842,11 +875,21 @@ public Builder setEndpoint(String endpoint) {
842875
}
843876

844877
public Builder setMtlsEndpoint(String mtlsEndpoint) {
845-
validateEndpoint(mtlsEndpoint);
878+
if (!mtlsEndpoint.isEmpty()) {
879+
validateEndpoint(mtlsEndpoint);
880+
}
846881
this.mtlsEndpoint = mtlsEndpoint;
847882
return this;
848883
}
849884

885+
public Builder setEndpointOverride(String endpointOverride) {
886+
if (!endpointOverride.isEmpty()) {
887+
validateEndpoint(endpointOverride);
888+
}
889+
this.endpointOverride = endpointOverride;
890+
return this;
891+
}
892+
850893
@VisibleForTesting
851894
Builder setMtlsProvider(MtlsProvider mtlsProvider) {
852895
this.mtlsProvider = mtlsProvider;
@@ -873,6 +916,10 @@ public String getMtlsEndpoint() {
873916
return mtlsEndpoint;
874917
}
875918

919+
public String getEndpointOverride() {
920+
return endpointOverride;
921+
}
922+
876923
/** The maximum message size allowed to be received on the channel. */
877924
public Builder setMaxInboundMessageSize(Integer max) {
878925
this.maxInboundMessageSize = max;

gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProviderTest.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
class InstantiatingGrpcChannelProviderTest extends AbstractMtlsTransportChannelTest {
8787
private static final String DEFAULT_ENDPOINT = "test.googleapis.com:443";
8888
private static final String DEFAULT_MTLS_ENDPOINT = "test.mtls.googleapis.com:443";
89+
private static final String DEFAULT_ENDPOINT_OVERRIDE = "test.endpoint.com:443";
8990
private static final String API_KEY_HEADER_VALUE = "fake_api_key_2";
9091
private static final String API_KEY_AUTH_HEADER_KEY = "x-goog-api-key";
9192
private static String originalOSName;
@@ -161,6 +162,32 @@ void testMtlsEndpointBadPort() {
161162
.setEndpoint("test.mtls.googleapis.com:abcd"));
162163
}
163164

165+
@Test
166+
void testEndpointOverrideEndpoint() {
167+
InstantiatingGrpcChannelProvider.Builder builder =
168+
InstantiatingGrpcChannelProvider.newBuilder();
169+
builder.setEndpointOverride(DEFAULT_ENDPOINT_OVERRIDE);
170+
assertEquals(builder.getEndpointOverride(), DEFAULT_ENDPOINT_OVERRIDE);
171+
172+
InstantiatingGrpcChannelProvider provider = builder.build();
173+
assertEquals(provider.getEndpointOverride(), DEFAULT_ENDPOINT_OVERRIDE);
174+
}
175+
176+
@Test
177+
void testEndpointOverrideNoPort() {
178+
assertThrows(
179+
IllegalArgumentException.class,
180+
() ->
181+
InstantiatingGrpcChannelProvider.newBuilder().setEndpointOverride("test.endpoint.com"));
182+
}
183+
184+
@Test
185+
void testEndpointOverrideBadPort() {
186+
assertThrows(
187+
IllegalArgumentException.class,
188+
() -> InstantiatingGrpcChannelProvider.newBuilder().setEndpoint("test.endpoint.com:abcd"));
189+
}
190+
164191
@Test
165192
void testKeepAlive() {
166193
final long millis = 15;
@@ -1041,8 +1068,9 @@ void shouldUseS2A_envVarNotSet_returnsFalse() {
10411068
.thenReturn("false");
10421069
InstantiatingGrpcChannelProvider provider =
10431070
InstantiatingGrpcChannelProvider.newBuilder()
1044-
.setEndpoint(DEFAULT_MTLS_ENDPOINT)
1071+
.setEndpoint(DEFAULT_ENDPOINT)
10451072
.setMtlsEndpoint(DEFAULT_MTLS_ENDPOINT)
1073+
.setEndpointOverride("")
10461074
.setEnvProvider(envProvider)
10471075
.build();
10481076
Truth.assertThat(provider.shouldUseS2A()).isFalse();
@@ -1056,6 +1084,8 @@ void shouldUseS2A_mtlsEndpointNotSet_returnsFalse() {
10561084
InstantiatingGrpcChannelProvider provider =
10571085
InstantiatingGrpcChannelProvider.newBuilder()
10581086
.setEndpoint(DEFAULT_ENDPOINT)
1087+
.setMtlsEndpoint("")
1088+
.setEndpointOverride("")
10591089
.setEnvProvider(envProvider)
10601090
.build();
10611091
Truth.assertThat(provider.shouldUseS2A()).isFalse();
@@ -1070,6 +1100,7 @@ void shouldUseS2A_endpointOverrideIsSet_returnsFalse() {
10701100
InstantiatingGrpcChannelProvider.newBuilder()
10711101
.setEndpoint(DEFAULT_ENDPOINT)
10721102
.setMtlsEndpoint(DEFAULT_MTLS_ENDPOINT)
1103+
.setEndpointOverride(DEFAULT_ENDPOINT_OVERRIDE)
10731104
.setEnvProvider(envProvider)
10741105
.build();
10751106
Truth.assertThat(provider.shouldUseS2A()).isFalse();
@@ -1082,8 +1113,9 @@ void shouldUseS2A_nonGDUUniverse_returnsFalse() {
10821113
.thenReturn("true");
10831114
InstantiatingGrpcChannelProvider provider =
10841115
InstantiatingGrpcChannelProvider.newBuilder()
1085-
.setEndpoint("test.mtls.abcd.com:443")
1116+
.setEndpoint("test.abcd.com:443")
10861117
.setMtlsEndpoint("test.mtls.abcd.com:443")
1118+
.setEndpointOverride("")
10871119
.setEnvProvider(envProvider)
10881120
.build();
10891121
Truth.assertThat(provider.shouldUseS2A()).isFalse();
@@ -1096,8 +1128,9 @@ void shouldUseS2A_returnsTrue() {
10961128
.thenReturn("true");
10971129
InstantiatingGrpcChannelProvider provider =
10981130
InstantiatingGrpcChannelProvider.newBuilder()
1099-
.setEndpoint(DEFAULT_MTLS_ENDPOINT)
1131+
.setEndpoint(DEFAULT_ENDPOINT)
11001132
.setMtlsEndpoint(DEFAULT_MTLS_ENDPOINT)
1133+
.setEndpointOverride("")
11011134
.setEnvProvider(envProvider)
11021135
.build();
11031136
Truth.assertThat(provider.shouldUseS2A()).isTrue();

gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/testing/LocalChannelProvider.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ public boolean needsMtlsEndpoint() {
106106
return false;
107107
}
108108

109+
@Override
110+
public boolean needsEndpointOverride() {
111+
return false;
112+
}
113+
109114
@Override
110115
public TransportChannelProvider withEndpoint(String endpoint) {
111116
throw new UnsupportedOperationException("LocalChannelProvider doesn't need an endpoint");
@@ -116,6 +121,12 @@ public TransportChannelProvider withMtlsEndpoint(String mtlsEndpoint) {
116121
throw new UnsupportedOperationException("LocalChannelProvider doesn't need an mtlsEndpoint");
117122
}
118123

124+
@Override
125+
public TransportChannelProvider withEndpointOverride(String endpointOverride) {
126+
throw new UnsupportedOperationException(
127+
"LocalChannelProvider doesn't need an endpointOverride");
128+
}
129+
119130
@Override
120131
@BetaApi("The surface for customizing pool size is not stable yet and may change in the future.")
121132
public boolean acceptsPoolSize() {

gax-java/gax-httpjson/src/main/java/com/google/api/gax/httpjson/InstantiatingHttpJsonChannelProvider.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ public boolean needsMtlsEndpoint() {
124124
return false;
125125
}
126126

127+
@Override
128+
public boolean needsEndpointOverride() {
129+
return false;
130+
}
131+
127132
@Override
128133
public TransportChannelProvider withEndpoint(String endpoint) {
129134
return toBuilder().setEndpoint(endpoint).build();
@@ -135,6 +140,12 @@ public TransportChannelProvider withMtlsEndpoint(String mtlsEndpoint) {
135140
"InstantiatingHttpJsonChannelProvider doesn't need an mtlsEndpoint");
136141
}
137142

143+
@Override
144+
public TransportChannelProvider withEndpointOverride(String endpointOverride) {
145+
throw new UnsupportedOperationException(
146+
"InstantiatingHttpJsonChannelProvider doesn't need an endpointOverride");
147+
}
148+
138149
/** @deprecated REST transport channel doesn't support channel pooling */
139150
@Deprecated
140151
@Override

gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientContext.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,10 @@ public static ClientContext create(StubSettings settings) throws IOException {
178178
// A valid EndpointContext should have been created in the StubSettings
179179
EndpointContext endpointContext = settings.getEndpointContext();
180180
String endpoint = endpointContext.resolvedEndpoint();
181-
String mtlsEndpoint = settings.getMtlsEndpoint();
181+
String mtlsEndpoint = "";
182+
mtlsEndpoint = settings.getMtlsEndpoint();
183+
String endpointOverride = "";
184+
endpointOverride = settings.getEndpointContext().transportChannelProviderEndpoint();
182185
Credentials credentials = getCredentials(settings);
183186
// check if need to adjust credentials/endpoint/endpointContext for GDC-H
184187
String settingsGdchApiAudience = settings.getGdchApiAudience();
@@ -190,6 +193,9 @@ public static ClientContext create(StubSettings settings) throws IOException {
190193
endpointContext = endpointContext.withGDCH();
191194
// Resolve the new endpoint with the GDC-H flow
192195
endpoint = endpointContext.resolvedEndpoint();
196+
// Skip S2A in GDC-H.
197+
mtlsEndpoint = "";
198+
endpointOverride = "";
193199
// We recompute the GdchCredentials with the audience
194200
credentials = getGdchCredentials(settingsGdchApiAudience, endpoint, credentials);
195201
} else if (!Strings.isNullOrEmpty(settingsGdchApiAudience)) {
@@ -226,6 +232,9 @@ public static ClientContext create(StubSettings settings) throws IOException {
226232
if (transportChannelProvider.needsMtlsEndpoint()) {
227233
transportChannelProvider = transportChannelProvider.withMtlsEndpoint(mtlsEndpoint);
228234
}
235+
if (transportChannelProvider.needsMtlsEndpoint()) {
236+
transportChannelProvider = transportChannelProvider.withEndpointOverride(endpointOverride);
237+
}
229238
TransportChannel transportChannel = transportChannelProvider.getTransportChannel();
230239

231240
ApiCallContext defaultCallContext =

gax-java/gax/src/main/java/com/google/api/gax/rpc/FixedTransportChannelProvider.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ public boolean needsMtlsEndpoint() {
8888
return false;
8989
}
9090

91+
@Override
92+
public boolean needsEndpointOverride() {
93+
return false;
94+
}
95+
9196
@Override
9297
public TransportChannelProvider withEndpoint(String endpoint) {
9398
throw new UnsupportedOperationException(
@@ -100,6 +105,12 @@ public TransportChannelProvider withMtlsEndpoint(String mtlsEndpoint) {
100105
"FixedTransportChannelProvider doesn't need an mtlsEndpoint");
101106
}
102107

108+
@Override
109+
public TransportChannelProvider withEndpointOverride(String endpointOverride) {
110+
throw new UnsupportedOperationException(
111+
"FixedTransportChannelProvider doesn't need an endpointOverride");
112+
}
113+
103114
/** @deprecated FixedTransportChannelProvider doesn't support ChannelPool configuration */
104115
@Deprecated
105116
@Override

gax-java/gax/src/main/java/com/google/api/gax/rpc/TransportChannelProvider.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ public interface TransportChannelProvider {
9393
/** True if the TransportProvider has no mtlsEndpoint set. */
9494
boolean needsMtlsEndpoint();
9595

96+
/** True if the TransportProvider has no endpointOverride set */
97+
boolean needsEndpointOverride();
98+
9699
/**
97100
* Sets the endpoint to use when constructing a new {@link TransportChannel}.
98101
*
@@ -107,6 +110,13 @@ public interface TransportChannelProvider {
107110
*/
108111
TransportChannelProvider withMtlsEndpoint(String mtlsEndpoint);
109112

113+
/**
114+
* Sets the endpoint override when constructing a new {@link TransportChannel}.
115+
*
116+
* <p>This method should only be called if {@link #needsEndpointOverride()} returns true.
117+
*/
118+
TransportChannelProvider withEndpointOverride(String endpointOverride);
119+
110120
/**
111121
* Reports whether this provider allows pool size customization.
112122
*

0 commit comments

Comments
 (0)