Skip to content

Commit

Permalink
Add check for empty addresses and if not there disable ipV6. (grpc#10848
Browse files Browse the repository at this point in the history
)

* Add check for empty addresses and if not there dissable ipV6.
  • Loading branch information
larry-safran authored Jan 30, 2024
1 parent 7f4c16e commit ae5fdd5
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import io.grpc.internal.SharedResourceHolder;
import io.grpc.internal.SharedResourceHolder.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
Expand All @@ -43,11 +44,15 @@
import java.util.Map;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* CloudToProd version of {@link NameResolver}.
*/
final class GoogleCloudToProdNameResolver extends NameResolver {
private static final Logger logger =
Logger.getLogger(GoogleCloudToProdNameResolver.class.getName());

@VisibleForTesting
static final String METADATA_URL_ZONE =
Expand Down Expand Up @@ -142,13 +147,20 @@ private void resolve() {
if (resolving || shutdown || delegate == null) {
return;
}

resolving = true;
if (logger.isLoggable(Level.FINE)) {
logger.fine("resolve with schemaOverride = " + schemeOverride);
}

if (schemeOverride.equals("dns")) {
delegate.start(listener);
succeeded = true;
resolving = false;
return;
}

// Since not dns, we must be using xds
if (executor == null) {
executor = SharedResourceHolder.get(executorResource);
}
Expand Down Expand Up @@ -267,7 +279,13 @@ private boolean queryIpv6SupportMetadata(String url) throws IOException {
HttpURLConnection con = null;
try {
con = httpConnectionProvider.createConnection(url);
return con.getResponseCode() == 200;
if (con.getResponseCode() != 200 ) {
return false;
}
InputStream inputStream = con.getInputStream();
int c;
return (inputStream != null
&& (c = inputStream.read()) != -1 && !Character.isWhitespace(c));
} finally {
if (con != null) {
con.disconnect();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,10 @@ public void tearDown() {
}

private void createResolver() {
createResolver("1:1:1");
}

private void createResolver(String responseToIpV6) {
HttpConnectionProvider httpConnections = new HttpConnectionProvider() {
@Override
public HttpURLConnection createConnection(String url) throws IOException {
Expand All @@ -135,6 +139,10 @@ public HttpURLConnection createConnection(String url) throws IOException {
new ByteArrayInputStream(("/" + ZONE).getBytes(StandardCharsets.UTF_8)));
return con;
} else if (url.equals(GoogleCloudToProdNameResolver.METADATA_URL_SUPPORT_IPV6)) {
if (responseToIpV6 != null) {
when(con.getInputStream()).thenReturn(
new ByteArrayInputStream(responseToIpV6.getBytes(StandardCharsets.UTF_8)));
}
return con;
}
throw new AssertionError("Unknown http query");
Expand All @@ -147,7 +155,7 @@ public HttpURLConnection createConnection(String url) throws IOException {
}

@Test
public void notOnGcpDelegateToDns() {
public void notOnGcp_DelegateToDns() {
GoogleCloudToProdNameResolver.isOnGcp = false;
createResolver();
resolver.start(mockListener);
Expand All @@ -156,7 +164,7 @@ public void notOnGcpDelegateToDns() {
}

@Test
public void hasProvidedBootstrapDelegateToDns() {
public void hasProvidedBootstrap_DelegateToDns() {
GoogleCloudToProdNameResolver.isOnGcp = true;
GoogleCloudToProdNameResolver.xdsBootstrapProvided = true;
GoogleCloudToProdNameResolver.enableFederation = false;
Expand All @@ -168,7 +176,7 @@ public void hasProvidedBootstrapDelegateToDns() {

@SuppressWarnings("unchecked")
@Test
public void onGcpAndNoProvidedBootstrapDelegateToXds() {
public void onGcpAndNoProvidedBootstrap_DelegateToXds() {
GoogleCloudToProdNameResolver.isOnGcp = true;
GoogleCloudToProdNameResolver.xdsBootstrapProvided = false;
createResolver();
Expand Down Expand Up @@ -196,7 +204,51 @@ public void onGcpAndNoProvidedBootstrapDelegateToXds() {

@SuppressWarnings("unchecked")
@Test
public void onGcpAndNoProvidedBootstrapAndFederationEnabledDelegateToXds() {
public void onGcpAndNoProvidedBootstrap_DelegateToXds_noIpV6() {
GoogleCloudToProdNameResolver.isOnGcp = true;
GoogleCloudToProdNameResolver.xdsBootstrapProvided = false;
createResolver(null);
resolver.start(mockListener);
fakeExecutor.runDueTasks();
assertThat(delegatedResolver.keySet()).containsExactly("xds");
verify(Iterables.getOnlyElement(delegatedResolver.values())).start(mockListener);
Map<String, ?> bootstrap = fakeBootstrapSetter.bootstrapRef.get();
Map<String, ?> node = (Map<String, ?>) bootstrap.get("node");
assertThat(node).containsExactly(
"id", "C2P-991614323",
"locality", ImmutableMap.of("zone", ZONE));
Map<String, ?> server = Iterables.getOnlyElement(
(List<Map<String, ?>>) bootstrap.get("xds_servers"));
assertThat(server).containsExactly(
"server_uri", "directpath-pa.googleapis.com",
"channel_creds", ImmutableList.of(ImmutableMap.of("type", "google_default")),
"server_features", ImmutableList.of("xds_v3", "ignore_resource_deletion"));
Map<String, ?> authorities = (Map<String, ?>) bootstrap.get("authorities");
assertThat(authorities).containsExactly(
"traffic-director-c2p.xds.googleapis.com",
ImmutableMap.of("xds_servers", ImmutableList.of(server)));
}

@SuppressWarnings("unchecked")
@Test
public void emptyResolverMeetadataValue() {
GoogleCloudToProdNameResolver.isOnGcp = true;
GoogleCloudToProdNameResolver.xdsBootstrapProvided = false;
createResolver("");
resolver.start(mockListener);
fakeExecutor.runDueTasks();
assertThat(delegatedResolver.keySet()).containsExactly("xds");
verify(Iterables.getOnlyElement(delegatedResolver.values())).start(mockListener);
Map<String, ?> bootstrap = fakeBootstrapSetter.bootstrapRef.get();
Map<String, ?> node = (Map<String, ?>) bootstrap.get("node");
assertThat(node).containsExactly(
"id", "C2P-991614323",
"locality", ImmutableMap.of("zone", ZONE));
}

@SuppressWarnings("unchecked")
@Test
public void onGcpAndNoProvidedBootstrapAndFederationEnabled_DelegateToXds() {
GoogleCloudToProdNameResolver.isOnGcp = true;
GoogleCloudToProdNameResolver.xdsBootstrapProvided = false;
GoogleCloudToProdNameResolver.enableFederation = true;
Expand Down Expand Up @@ -226,7 +278,7 @@ public void onGcpAndNoProvidedBootstrapAndFederationEnabledDelegateToXds() {

@SuppressWarnings("unchecked")
@Test
public void onGcpAndProvidedBootstrapAndFederationEnabledDontDelegateToXds() {
public void onGcpAndProvidedBootstrapAndFederationEnabled_DontDelegateToXds() {
GoogleCloudToProdNameResolver.isOnGcp = true;
GoogleCloudToProdNameResolver.xdsBootstrapProvided = true;
GoogleCloudToProdNameResolver.enableFederation = true;
Expand Down

0 comments on commit ae5fdd5

Please sign in to comment.