Skip to content

Commit ae5fdd5

Browse files
authored
Add check for empty addresses and if not there disable ipV6. (grpc#10848)
* Add check for empty addresses and if not there dissable ipV6.
1 parent 7f4c16e commit ae5fdd5

File tree

2 files changed

+76
-6
lines changed

2 files changed

+76
-6
lines changed

googleapis/src/main/java/io/grpc/googleapis/GoogleCloudToProdNameResolver.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import io.grpc.internal.SharedResourceHolder;
3535
import io.grpc.internal.SharedResourceHolder.Resource;
3636
import java.io.IOException;
37+
import java.io.InputStream;
3738
import java.io.InputStreamReader;
3839
import java.io.Reader;
3940
import java.net.HttpURLConnection;
@@ -43,11 +44,15 @@
4344
import java.util.Map;
4445
import java.util.Random;
4546
import java.util.concurrent.Executor;
47+
import java.util.logging.Level;
48+
import java.util.logging.Logger;
4649

4750
/**
4851
* CloudToProd version of {@link NameResolver}.
4952
*/
5053
final class GoogleCloudToProdNameResolver extends NameResolver {
54+
private static final Logger logger =
55+
Logger.getLogger(GoogleCloudToProdNameResolver.class.getName());
5156

5257
@VisibleForTesting
5358
static final String METADATA_URL_ZONE =
@@ -142,13 +147,20 @@ private void resolve() {
142147
if (resolving || shutdown || delegate == null) {
143148
return;
144149
}
150+
145151
resolving = true;
152+
if (logger.isLoggable(Level.FINE)) {
153+
logger.fine("resolve with schemaOverride = " + schemeOverride);
154+
}
155+
146156
if (schemeOverride.equals("dns")) {
147157
delegate.start(listener);
148158
succeeded = true;
149159
resolving = false;
150160
return;
151161
}
162+
163+
// Since not dns, we must be using xds
152164
if (executor == null) {
153165
executor = SharedResourceHolder.get(executorResource);
154166
}
@@ -267,7 +279,13 @@ private boolean queryIpv6SupportMetadata(String url) throws IOException {
267279
HttpURLConnection con = null;
268280
try {
269281
con = httpConnectionProvider.createConnection(url);
270-
return con.getResponseCode() == 200;
282+
if (con.getResponseCode() != 200 ) {
283+
return false;
284+
}
285+
InputStream inputStream = con.getInputStream();
286+
int c;
287+
return (inputStream != null
288+
&& (c = inputStream.read()) != -1 && !Character.isWhitespace(c));
271289
} finally {
272290
if (con != null) {
273291
con.disconnect();

googleapis/src/test/java/io/grpc/googleapis/GoogleCloudToProdNameResolverTest.java

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,10 @@ public void tearDown() {
125125
}
126126

127127
private void createResolver() {
128+
createResolver("1:1:1");
129+
}
130+
131+
private void createResolver(String responseToIpV6) {
128132
HttpConnectionProvider httpConnections = new HttpConnectionProvider() {
129133
@Override
130134
public HttpURLConnection createConnection(String url) throws IOException {
@@ -135,6 +139,10 @@ public HttpURLConnection createConnection(String url) throws IOException {
135139
new ByteArrayInputStream(("/" + ZONE).getBytes(StandardCharsets.UTF_8)));
136140
return con;
137141
} else if (url.equals(GoogleCloudToProdNameResolver.METADATA_URL_SUPPORT_IPV6)) {
142+
if (responseToIpV6 != null) {
143+
when(con.getInputStream()).thenReturn(
144+
new ByteArrayInputStream(responseToIpV6.getBytes(StandardCharsets.UTF_8)));
145+
}
138146
return con;
139147
}
140148
throw new AssertionError("Unknown http query");
@@ -147,7 +155,7 @@ public HttpURLConnection createConnection(String url) throws IOException {
147155
}
148156

149157
@Test
150-
public void notOnGcpDelegateToDns() {
158+
public void notOnGcp_DelegateToDns() {
151159
GoogleCloudToProdNameResolver.isOnGcp = false;
152160
createResolver();
153161
resolver.start(mockListener);
@@ -156,7 +164,7 @@ public void notOnGcpDelegateToDns() {
156164
}
157165

158166
@Test
159-
public void hasProvidedBootstrapDelegateToDns() {
167+
public void hasProvidedBootstrap_DelegateToDns() {
160168
GoogleCloudToProdNameResolver.isOnGcp = true;
161169
GoogleCloudToProdNameResolver.xdsBootstrapProvided = true;
162170
GoogleCloudToProdNameResolver.enableFederation = false;
@@ -168,7 +176,7 @@ public void hasProvidedBootstrapDelegateToDns() {
168176

169177
@SuppressWarnings("unchecked")
170178
@Test
171-
public void onGcpAndNoProvidedBootstrapDelegateToXds() {
179+
public void onGcpAndNoProvidedBootstrap_DelegateToXds() {
172180
GoogleCloudToProdNameResolver.isOnGcp = true;
173181
GoogleCloudToProdNameResolver.xdsBootstrapProvided = false;
174182
createResolver();
@@ -196,7 +204,51 @@ public void onGcpAndNoProvidedBootstrapDelegateToXds() {
196204

197205
@SuppressWarnings("unchecked")
198206
@Test
199-
public void onGcpAndNoProvidedBootstrapAndFederationEnabledDelegateToXds() {
207+
public void onGcpAndNoProvidedBootstrap_DelegateToXds_noIpV6() {
208+
GoogleCloudToProdNameResolver.isOnGcp = true;
209+
GoogleCloudToProdNameResolver.xdsBootstrapProvided = false;
210+
createResolver(null);
211+
resolver.start(mockListener);
212+
fakeExecutor.runDueTasks();
213+
assertThat(delegatedResolver.keySet()).containsExactly("xds");
214+
verify(Iterables.getOnlyElement(delegatedResolver.values())).start(mockListener);
215+
Map<String, ?> bootstrap = fakeBootstrapSetter.bootstrapRef.get();
216+
Map<String, ?> node = (Map<String, ?>) bootstrap.get("node");
217+
assertThat(node).containsExactly(
218+
"id", "C2P-991614323",
219+
"locality", ImmutableMap.of("zone", ZONE));
220+
Map<String, ?> server = Iterables.getOnlyElement(
221+
(List<Map<String, ?>>) bootstrap.get("xds_servers"));
222+
assertThat(server).containsExactly(
223+
"server_uri", "directpath-pa.googleapis.com",
224+
"channel_creds", ImmutableList.of(ImmutableMap.of("type", "google_default")),
225+
"server_features", ImmutableList.of("xds_v3", "ignore_resource_deletion"));
226+
Map<String, ?> authorities = (Map<String, ?>) bootstrap.get("authorities");
227+
assertThat(authorities).containsExactly(
228+
"traffic-director-c2p.xds.googleapis.com",
229+
ImmutableMap.of("xds_servers", ImmutableList.of(server)));
230+
}
231+
232+
@SuppressWarnings("unchecked")
233+
@Test
234+
public void emptyResolverMeetadataValue() {
235+
GoogleCloudToProdNameResolver.isOnGcp = true;
236+
GoogleCloudToProdNameResolver.xdsBootstrapProvided = false;
237+
createResolver("");
238+
resolver.start(mockListener);
239+
fakeExecutor.runDueTasks();
240+
assertThat(delegatedResolver.keySet()).containsExactly("xds");
241+
verify(Iterables.getOnlyElement(delegatedResolver.values())).start(mockListener);
242+
Map<String, ?> bootstrap = fakeBootstrapSetter.bootstrapRef.get();
243+
Map<String, ?> node = (Map<String, ?>) bootstrap.get("node");
244+
assertThat(node).containsExactly(
245+
"id", "C2P-991614323",
246+
"locality", ImmutableMap.of("zone", ZONE));
247+
}
248+
249+
@SuppressWarnings("unchecked")
250+
@Test
251+
public void onGcpAndNoProvidedBootstrapAndFederationEnabled_DelegateToXds() {
200252
GoogleCloudToProdNameResolver.isOnGcp = true;
201253
GoogleCloudToProdNameResolver.xdsBootstrapProvided = false;
202254
GoogleCloudToProdNameResolver.enableFederation = true;
@@ -226,7 +278,7 @@ public void onGcpAndNoProvidedBootstrapAndFederationEnabledDelegateToXds() {
226278

227279
@SuppressWarnings("unchecked")
228280
@Test
229-
public void onGcpAndProvidedBootstrapAndFederationEnabledDontDelegateToXds() {
281+
public void onGcpAndProvidedBootstrapAndFederationEnabled_DontDelegateToXds() {
230282
GoogleCloudToProdNameResolver.isOnGcp = true;
231283
GoogleCloudToProdNameResolver.xdsBootstrapProvided = true;
232284
GoogleCloudToProdNameResolver.enableFederation = true;

0 commit comments

Comments
 (0)