From 84cacc711a48f81b919b2455eaa98a6305b2acac Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Tue, 13 Jul 2021 14:32:33 -0700 Subject: [PATCH 1/4] add override bootstrap in XdsNameResolver --- .../java/io/grpc/xds/XdsNameResolver.java | 8 ++-- .../io/grpc/xds/XdsNameResolverProvider.java | 23 +++++++---- .../java/io/grpc/xds/XdsNameResolverTest.java | 40 ++++++++++++++++--- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsNameResolver.java b/xds/src/main/java/io/grpc/xds/XdsNameResolver.java index 0bcc5722571..2901f727927 100644 --- a/xds/src/main/java/io/grpc/xds/XdsNameResolver.java +++ b/xds/src/main/java/io/grpc/xds/XdsNameResolver.java @@ -120,22 +120,24 @@ final class XdsNameResolver extends NameResolver { private ResolveState resolveState; XdsNameResolver(String name, ServiceConfigParser serviceConfigParser, - SynchronizationContext syncContext, ScheduledExecutorService scheduler) { + SynchronizationContext syncContext, ScheduledExecutorService scheduler, + @Nullable Map bootstrapOverride) { this(name, serviceConfigParser, syncContext, scheduler, SharedXdsClientPoolProvider.getDefaultProvider(), ThreadSafeRandomImpl.instance, - FilterRegistry.getDefaultRegistry()); + FilterRegistry.getDefaultRegistry(), bootstrapOverride); } @VisibleForTesting XdsNameResolver(String name, ServiceConfigParser serviceConfigParser, SynchronizationContext syncContext, ScheduledExecutorService scheduler, XdsClientPoolFactory xdsClientPoolFactory, ThreadSafeRandom random, - FilterRegistry filterRegistry) { + FilterRegistry filterRegistry, @Nullable Map bootstrapOverride) { authority = GrpcUtil.checkAuthority(checkNotNull(name, "name")); this.serviceConfigParser = checkNotNull(serviceConfigParser, "serviceConfigParser"); this.syncContext = checkNotNull(syncContext, "syncContext"); this.scheduler = checkNotNull(scheduler, "scheduler"); this.xdsClientPoolFactory = checkNotNull(xdsClientPoolFactory, "xdsClientPoolFactory"); + this.xdsClientPoolFactory.setBootstrapOverride(bootstrapOverride); this.random = checkNotNull(random, "random"); this.filterRegistry = checkNotNull(filterRegistry, "filterRegistry"); logId = InternalLogId.allocate("xds-resolver", name); diff --git a/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java b/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java index 40aa4f919e9..b36dc008622 100644 --- a/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java +++ b/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java @@ -43,22 +43,31 @@ public final class XdsNameResolverProvider extends NameResolverProvider { private static final String SCHEME = "xds"; - @Override - public XdsNameResolver newNameResolver(URI targetUri, Args args) { + /** + * Allows injecting bootstrapOverride to the name resolver. + * */ + public XdsNameResolver newNameResolver(URI targetUri, Args args, + @Nullable Map bootstrapOverride) { if (SCHEME.equals(targetUri.getScheme())) { String targetPath = checkNotNull(targetUri.getPath(), "targetPath"); Preconditions.checkArgument( - targetPath.startsWith("/"), - "the path component (%s) of the target (%s) must start with '/'", - targetPath, - targetUri); + targetPath.startsWith("/"), + "the path component (%s) of the target (%s) must start with '/'", + targetPath, + targetUri); String name = targetPath.substring(1); return new XdsNameResolver(name, args.getServiceConfigParser(), - args.getSynchronizationContext(), args.getScheduledExecutorService()); + args.getSynchronizationContext(), args.getScheduledExecutorService(), + bootstrapOverride); } return null; } + @Override + public XdsNameResolver newNameResolver(URI targetUri, Args args) { + return newNameResolver(targetUri, args, null); + } + @Override public String getDefaultScheme() { return SCHEME; diff --git a/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java b/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java index 6a3e4cfb98e..0c451c22227 100644 --- a/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java @@ -36,6 +36,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; +import com.google.common.util.concurrent.SettableFuture; import com.google.re2j.Pattern; import io.grpc.CallOptions; import io.grpc.Channel; @@ -78,6 +79,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; @@ -148,7 +150,7 @@ public void setUp() { new FaultFilter(mockRandom, new AtomicLong()), RouterFilter.INSTANCE); resolver = new XdsNameResolver(AUTHORITY, serviceConfigParser, syncContext, scheduler, - xdsClientPoolFactory, mockRandom, filterRegistry); + xdsClientPoolFactory, mockRandom, filterRegistry, null); } @After @@ -167,7 +169,6 @@ public void resolving_failToCreateXdsClientPool() { XdsClientPoolFactory xdsClientPoolFactory = new XdsClientPoolFactory() { @Override public void setBootstrapOverride(Map bootstrap) { - throw new UnsupportedOperationException("Should not be called"); } @Override @@ -181,8 +182,9 @@ public ObjectPool getOrCreate() throws XdsInitializationException { throw new XdsInitializationException("Fail to read bootstrap file"); } }; + Map b = new HashMap<>(); resolver = new XdsNameResolver(AUTHORITY, serviceConfigParser, syncContext, scheduler, - xdsClientPoolFactory, mockRandom, FilterRegistry.getDefaultRegistry()); + xdsClientPoolFactory, mockRandom, FilterRegistry.getDefaultRegistry(), b); resolver.start(mockListener); verify(mockListener).onError(errorCaptor.capture()); Status error = errorCaptor.getValue(); @@ -191,6 +193,34 @@ public ObjectPool getOrCreate() throws XdsInitializationException { assertThat(error.getCause()).hasMessageThat().isEqualTo("Fail to read bootstrap file"); } + @Test + public void overrideBootstrap() throws Exception { + final SettableFuture> bootstrapSettable = SettableFuture.create(); + XdsClientPoolFactory xdsClientPoolFactory = new XdsClientPoolFactory() { + + @Override + public void setBootstrapOverride(Map bootstrap) { + assertThat(bootstrapSettable.set(bootstrap)).isTrue(); + } + + @Override + @Nullable + public ObjectPool get() { + throw new UnsupportedOperationException("Should not be called"); + } + + @Override + public ObjectPool getOrCreate() throws XdsInitializationException { + assertThat(bootstrapSettable.isDone()).isTrue(); + return null; + } + }; + Map b = new HashMap<>(); + resolver = new XdsNameResolver(AUTHORITY, serviceConfigParser, syncContext, scheduler, + xdsClientPoolFactory, mockRandom, FilterRegistry.getDefaultRegistry(), b); + assertThat(bootstrapSettable.get()).isSameInstanceAs(b); + } + @Test public void resolving_ldsResourceNotFound() { resolver.start(mockListener); @@ -583,7 +613,7 @@ public void resolved_rpcHashingByChannelId() { resolver.shutdown(); reset(mockListener); resolver = new XdsNameResolver(AUTHORITY, serviceConfigParser, syncContext, scheduler, - xdsClientPoolFactory, mockRandom, FilterRegistry.getDefaultRegistry()); + xdsClientPoolFactory, mockRandom, FilterRegistry.getDefaultRegistry(), null); resolver.start(mockListener); xdsClient = (FakeXdsClient) resolver.getXdsClient(); xdsClient.deliverLdsUpdate( @@ -1556,10 +1586,8 @@ public void routeMatching_withHeaders() { } private final class FakeXdsClientPoolFactory implements XdsClientPoolFactory { - @Override public void setBootstrapOverride(Map bootstrap) { - throw new UnsupportedOperationException("Should not be called"); } @Override From 8f38f34705f34db27e9103928dc27dd856dc467e Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Thu, 5 Aug 2021 18:29:58 -0700 Subject: [PATCH 2/4] fix --- .../io/grpc/xds/XdsNameResolverProvider.java | 29 ++++++----- .../grpc/xds/XdsNameResolverProviderTest.java | 50 +++++++++++++++++++ .../java/io/grpc/xds/XdsNameResolverTest.java | 29 ----------- 3 files changed, 67 insertions(+), 41 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java b/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java index e8f27580dc8..7c1b3fd1d3a 100644 --- a/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java +++ b/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java @@ -41,14 +41,24 @@ @Internal public final class XdsNameResolverProvider extends NameResolverProvider { - private static final String SCHEME = "xds"; + private String scheme = "xds"; + private Map bootstrapOverride; /** - * Allows injecting bootstrapOverride to the name resolver. - * */ - public XdsNameResolver newNameResolver(URI targetUri, Args args, - @Nullable Map bootstrapOverride) { - if (SCHEME.equals(targetUri.getScheme())) { + * A convenient method to create a {@link XdsNameResolverProvider} with custom scheme and + * bootstrap. + */ + public static XdsNameResolverProvider createForTest(String scheme, + @Nullable Map bootstrapOverride) { + XdsNameResolverProvider provider = new XdsNameResolverProvider(); + provider.scheme = checkNotNull(scheme, "scheme"); + provider.bootstrapOverride = bootstrapOverride; + return provider; + } + + @Override + public XdsNameResolver newNameResolver(URI targetUri, Args args) { + if (scheme.equals(targetUri.getScheme())) { String targetPath = checkNotNull(targetUri.getPath(), "targetPath"); Preconditions.checkArgument( targetPath.startsWith("/"), @@ -63,14 +73,9 @@ public XdsNameResolver newNameResolver(URI targetUri, Args args, return null; } - @Override - public XdsNameResolver newNameResolver(URI targetUri, Args args) { - return newNameResolver(targetUri, args, null); - } - @Override public String getDefaultScheme() { - return SCHEME; + return scheme; } @Override diff --git a/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java b/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java index ba1e561410f..3d1a4fe1843 100644 --- a/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java @@ -20,15 +20,20 @@ import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; +import com.google.common.collect.ImmutableMap; import io.grpc.ChannelLogger; import io.grpc.InternalServiceProviders; import io.grpc.NameResolver; import io.grpc.NameResolver.ServiceConfigParser; import io.grpc.NameResolverProvider; +import io.grpc.NameResolverRegistry; import io.grpc.SynchronizationContext; import io.grpc.internal.FakeClock; import io.grpc.internal.GrpcUtil; import java.net.URI; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -114,4 +119,49 @@ public void invalidName_hostnameContainsUnderscore() { // Expected } } + + @Test + public void newProvider_createForTest() { + NameResolverRegistry registry = new NameResolverRegistry(); + XdsNameResolverProvider provider0 = XdsNameResolverProvider.createForTest("no-scheme", null); + registry.register(provider0); + XdsNameResolverProvider provider1 = XdsNameResolverProvider.createForTest("new-xds-scheme", + new HashMap()); + registry.register(provider1); + assertThat(registry.asFactory() + .newNameResolver(URI.create("new-xds-scheme:///localhost"), args)).isNotNull(); + assertThat(registry.asFactory() + .newNameResolver(URI.create("no-scheme:///localhost"), args)).isNotNull(); + registry.deregister(provider1); + assertThat(registry.asFactory() + .newNameResolver(URI.create("new-xds-scheme:///localhost"), args)).isNull(); + registry.deregister(provider0); + } + + @Test + public void newProvider_createForTest_overrideBootstrap() { + Map b = ImmutableMap.of( + "node", ImmutableMap.of( + "id", "ENVOY_NODE_ID", + "cluster", "ENVOY_CLUSTER"), + "xds_servers", Collections.singletonList( + ImmutableMap.of( + "server_uri", "trafficdirector.googleapis.com:443", + "channel_creds", Collections.singletonList( + ImmutableMap.of("type", "insecure") + ) + ) + ) + ); + NameResolverRegistry registry = new NameResolverRegistry(); + XdsNameResolverProvider provider = XdsNameResolverProvider.createForTest("no-scheme", b); + registry.register(provider); + NameResolver resolver = registry.asFactory() + .newNameResolver(URI.create("no-scheme:///localhost"), args); + resolver.start(mock(NameResolver.Listener2.class)); + assertThat(resolver).isInstanceOf(XdsNameResolver.class); + assertThat(((XdsNameResolver)resolver).getXdsClient().getBootstrapInfo().getNode().getId()) + .isEqualTo("ENVOY_NODE_ID"); + registry.deregister(provider); + } } diff --git a/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java b/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java index f96c88f4c2b..48b3d47f4c7 100644 --- a/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java @@ -37,7 +37,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; -import com.google.common.util.concurrent.SettableFuture; import com.google.protobuf.util.Durations; import com.google.re2j.Pattern; import io.grpc.CallOptions; @@ -198,34 +197,6 @@ public ObjectPool getOrCreate() throws XdsInitializationException { assertThat(error.getCause()).hasMessageThat().isEqualTo("Fail to read bootstrap file"); } - @Test - public void overrideBootstrap() throws Exception { - final SettableFuture> bootstrapSettable = SettableFuture.create(); - XdsClientPoolFactory xdsClientPoolFactory = new XdsClientPoolFactory() { - - @Override - public void setBootstrapOverride(Map bootstrap) { - assertThat(bootstrapSettable.set(bootstrap)).isTrue(); - } - - @Override - @Nullable - public ObjectPool get() { - throw new UnsupportedOperationException("Should not be called"); - } - - @Override - public ObjectPool getOrCreate() throws XdsInitializationException { - assertThat(bootstrapSettable.isDone()).isTrue(); - return null; - } - }; - Map b = new HashMap<>(); - resolver = new XdsNameResolver(AUTHORITY, serviceConfigParser, syncContext, scheduler, - xdsClientPoolFactory, mockRandom, FilterRegistry.getDefaultRegistry(), b); - assertThat(bootstrapSettable.get()).isSameInstanceAs(b); - } - @Test public void resolving_ldsResourceNotFound() { resolver.start(mockListener); From cf4b66795ed43b93b6ed7cb950c0b9dd8117615d Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Fri, 6 Aug 2021 10:02:08 -0700 Subject: [PATCH 3/4] fix --- .../grpc/xds/SharedXdsClientPoolProvider.java | 2 +- .../java/io/grpc/xds/XdsNameResolver.java | 3 ++- .../io/grpc/xds/XdsNameResolverProvider.java | 23 +++++++++++-------- .../grpc/xds/XdsNameResolverProviderTest.java | 17 +++++++++----- .../java/io/grpc/xds/XdsNameResolverTest.java | 4 +--- 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/SharedXdsClientPoolProvider.java b/xds/src/main/java/io/grpc/xds/SharedXdsClientPoolProvider.java index cc87b9c6b6f..95eef3e3d80 100644 --- a/xds/src/main/java/io/grpc/xds/SharedXdsClientPoolProvider.java +++ b/xds/src/main/java/io/grpc/xds/SharedXdsClientPoolProvider.java @@ -52,7 +52,7 @@ final class SharedXdsClientPoolProvider implements XdsClientPoolFactory { private final AtomicReference> bootstrapOverride = new AtomicReference<>(); private volatile ObjectPool xdsClientPool; - private SharedXdsClientPoolProvider() { + SharedXdsClientPoolProvider() { this(new BootstrapperImpl()); } diff --git a/xds/src/main/java/io/grpc/xds/XdsNameResolver.java b/xds/src/main/java/io/grpc/xds/XdsNameResolver.java index 60eb74edc96..787336e4b54 100644 --- a/xds/src/main/java/io/grpc/xds/XdsNameResolver.java +++ b/xds/src/main/java/io/grpc/xds/XdsNameResolver.java @@ -140,7 +140,8 @@ final class XdsNameResolver extends NameResolver { this.serviceConfigParser = checkNotNull(serviceConfigParser, "serviceConfigParser"); this.syncContext = checkNotNull(syncContext, "syncContext"); this.scheduler = checkNotNull(scheduler, "scheduler"); - this.xdsClientPoolFactory = checkNotNull(xdsClientPoolFactory, "xdsClientPoolFactory"); + this.xdsClientPoolFactory = bootstrapOverride == null ? checkNotNull(xdsClientPoolFactory, + "xdsClientPoolFactory") : new SharedXdsClientPoolProvider(); this.xdsClientPoolFactory.setBootstrapOverride(bootstrapOverride); this.random = checkNotNull(random, "random"); this.filterRegistry = checkNotNull(filterRegistry, "filterRegistry"); diff --git a/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java b/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java index 7c1b3fd1d3a..c11457934e9 100644 --- a/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java +++ b/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java @@ -41,19 +41,22 @@ @Internal public final class XdsNameResolverProvider extends NameResolverProvider { - private String scheme = "xds"; - private Map bootstrapOverride; + private static final String SCHEME = "xds"; + private final String scheme; + private final Map bootstrapOverride; + + public XdsNameResolverProvider() { + this(SCHEME, null); + } /** - * A convenient method to create a {@link XdsNameResolverProvider} with custom scheme and - * bootstrap. + * A convenient constructor to allow creating a {@link XdsNameResolverProvider} with custom scheme + * and bootstrap. */ - public static XdsNameResolverProvider createForTest(String scheme, - @Nullable Map bootstrapOverride) { - XdsNameResolverProvider provider = new XdsNameResolverProvider(); - provider.scheme = checkNotNull(scheme, "scheme"); - provider.bootstrapOverride = bootstrapOverride; - return provider; + public XdsNameResolverProvider(String scheme, + @Nullable Map bootstrapOverride) { + this.scheme = checkNotNull(scheme, "scheme"); + this.bootstrapOverride = bootstrapOverride; } @Override diff --git a/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java b/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java index 3d1a4fe1843..1f54ea5e2c8 100644 --- a/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java @@ -121,13 +121,15 @@ public void invalidName_hostnameContainsUnderscore() { } @Test - public void newProvider_createForTest() { - NameResolverRegistry registry = new NameResolverRegistry(); - XdsNameResolverProvider provider0 = XdsNameResolverProvider.createForTest("no-scheme", null); + public void newProvider_multipleScheme() { + NameResolverRegistry registry = NameResolverRegistry.getDefaultRegistry(); + XdsNameResolverProvider provider0 = new XdsNameResolverProvider("no-scheme", null); registry.register(provider0); - XdsNameResolverProvider provider1 = XdsNameResolverProvider.createForTest("new-xds-scheme", + XdsNameResolverProvider provider1 = new XdsNameResolverProvider("new-xds-scheme", new HashMap()); registry.register(provider1); + assertThat(registry.asFactory() + .newNameResolver(URI.create("xds:///localhost"), args)).isNotNull(); assertThat(registry.asFactory() .newNameResolver(URI.create("new-xds-scheme:///localhost"), args)).isNotNull(); assertThat(registry.asFactory() @@ -136,10 +138,12 @@ public void newProvider_createForTest() { assertThat(registry.asFactory() .newNameResolver(URI.create("new-xds-scheme:///localhost"), args)).isNull(); registry.deregister(provider0); + assertThat(registry.asFactory() + .newNameResolver(URI.create("xds:///localhost"), args)).isNotNull(); } @Test - public void newProvider_createForTest_overrideBootstrap() { + public void newProvider_overrideBootstrap() { Map b = ImmutableMap.of( "node", ImmutableMap.of( "id", "ENVOY_NODE_ID", @@ -154,7 +158,7 @@ public void newProvider_createForTest_overrideBootstrap() { ) ); NameResolverRegistry registry = new NameResolverRegistry(); - XdsNameResolverProvider provider = XdsNameResolverProvider.createForTest("no-scheme", b); + XdsNameResolverProvider provider = new XdsNameResolverProvider("no-scheme", b); registry.register(provider); NameResolver resolver = registry.asFactory() .newNameResolver(URI.create("no-scheme:///localhost"), args); @@ -162,6 +166,7 @@ public void newProvider_createForTest_overrideBootstrap() { assertThat(resolver).isInstanceOf(XdsNameResolver.class); assertThat(((XdsNameResolver)resolver).getXdsClient().getBootstrapInfo().getNode().getId()) .isEqualTo("ENVOY_NODE_ID"); + resolver.shutdown(); registry.deregister(provider); } } diff --git a/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java b/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java index 48b3d47f4c7..22d7302f207 100644 --- a/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsNameResolverTest.java @@ -83,7 +83,6 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; @@ -186,9 +185,8 @@ public ObjectPool getOrCreate() throws XdsInitializationException { throw new XdsInitializationException("Fail to read bootstrap file"); } }; - Map b = new HashMap<>(); resolver = new XdsNameResolver(AUTHORITY, serviceConfigParser, syncContext, scheduler, - xdsClientPoolFactory, mockRandom, FilterRegistry.getDefaultRegistry(), b); + xdsClientPoolFactory, mockRandom, FilterRegistry.getDefaultRegistry(), null); resolver.start(mockListener); verify(mockListener).onError(errorCaptor.capture()); Status error = errorCaptor.getValue(); From e09f7445fb89a5d7e9f5dce1560dfe7200d78cf0 Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Fri, 6 Aug 2021 16:36:11 -0700 Subject: [PATCH 4/4] fix... --- .../java/io/grpc/xds/XdsNameResolverProvider.java | 15 ++++++++++----- .../io/grpc/xds/XdsNameResolverProviderTest.java | 6 +++--- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java b/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java index c11457934e9..03d88a9752e 100644 --- a/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java +++ b/xds/src/main/java/io/grpc/xds/XdsNameResolverProvider.java @@ -49,16 +49,21 @@ public XdsNameResolverProvider() { this(SCHEME, null); } - /** - * A convenient constructor to allow creating a {@link XdsNameResolverProvider} with custom scheme - * and bootstrap. - */ - public XdsNameResolverProvider(String scheme, + private XdsNameResolverProvider(String scheme, @Nullable Map bootstrapOverride) { this.scheme = checkNotNull(scheme, "scheme"); this.bootstrapOverride = bootstrapOverride; } + /** + * A convenient method to allow creating a {@link XdsNameResolverProvider} with custom scheme + * and bootstrap. + */ + public static XdsNameResolverProvider createForTest(String scheme, + @Nullable Map bootstrapOverride) { + return new XdsNameResolverProvider(scheme, bootstrapOverride); + } + @Override public XdsNameResolver newNameResolver(URI targetUri, Args args) { if (scheme.equals(targetUri.getScheme())) { diff --git a/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java b/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java index 1f54ea5e2c8..32850b441d7 100644 --- a/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java +++ b/xds/src/test/java/io/grpc/xds/XdsNameResolverProviderTest.java @@ -123,9 +123,9 @@ public void invalidName_hostnameContainsUnderscore() { @Test public void newProvider_multipleScheme() { NameResolverRegistry registry = NameResolverRegistry.getDefaultRegistry(); - XdsNameResolverProvider provider0 = new XdsNameResolverProvider("no-scheme", null); + XdsNameResolverProvider provider0 = XdsNameResolverProvider.createForTest("no-scheme", null); registry.register(provider0); - XdsNameResolverProvider provider1 = new XdsNameResolverProvider("new-xds-scheme", + XdsNameResolverProvider provider1 = XdsNameResolverProvider.createForTest("new-xds-scheme", new HashMap()); registry.register(provider1); assertThat(registry.asFactory() @@ -158,7 +158,7 @@ public void newProvider_overrideBootstrap() { ) ); NameResolverRegistry registry = new NameResolverRegistry(); - XdsNameResolverProvider provider = new XdsNameResolverProvider("no-scheme", b); + XdsNameResolverProvider provider = XdsNameResolverProvider.createForTest("no-scheme", b); registry.register(provider); NameResolver resolver = registry.asFactory() .newNameResolver(URI.create("no-scheme:///localhost"), args);