diff --git a/README.md b/README.md index 024f41511..e4f708557 100644 --- a/README.md +++ b/README.md @@ -50,20 +50,20 @@ If you are using Maven without the BOM, add this to your dependencies: If you are using Gradle 5.x or later, add this to your dependencies: ```Groovy -implementation platform('com.google.cloud:libraries-bom:26.29.0') +implementation platform('com.google.cloud:libraries-bom:26.31.0') implementation 'com.google.cloud:google-cloud-datastore' ``` If you are using Gradle without BOM, add this to your dependencies: ```Groovy -implementation 'com.google.cloud:google-cloud-datastore:2.18.0' +implementation 'com.google.cloud:google-cloud-datastore:2.18.3' ``` If you are using SBT, add this to your dependencies: ```Scala -libraryDependencies += "com.google.cloud" % "google-cloud-datastore" % "2.18.0" +libraryDependencies += "com.google.cloud" % "google-cloud-datastore" % "2.18.3" ``` @@ -380,7 +380,7 @@ Java is a registered trademark of Oracle and/or its affiliates. [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-datastore/java11.html [stability-image]: https://img.shields.io/badge/stability-stable-green [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-datastore.svg -[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-datastore/2.18.0 +[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-datastore/2.18.3 [authentication]: https://github.com/googleapis/google-cloud-java#authentication [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreOptions.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreOptions.java index c94e9ff7a..c852fdb7f 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreOptions.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreOptions.java @@ -18,6 +18,9 @@ import static com.google.cloud.datastore.Validator.validateNamespace; +import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; +import com.google.api.gax.rpc.TransportChannelProvider; import com.google.cloud.ServiceDefaults; import com.google.cloud.ServiceOptions; import com.google.cloud.ServiceRpc; @@ -46,6 +49,9 @@ public class DatastoreOptions extends ServiceOptions { + private final TransportOptions TRANSPORT_OPTIONS = getDefaultTransportOptionsBuilder().build(); @Override public DatastoreFactory getDefaultServiceFactory() { @@ -147,7 +219,11 @@ public DatastoreRpcFactory getDefaultRpcFactory() { @Override public TransportOptions getDefaultTransportOptions() { - return getDefaultGrpcTransportOptions(); + return TRANSPORT_OPTIONS; + } + + public static GrpcTransportOptions.Builder getDefaultTransportOptionsBuilder() { + return GrpcTransportOptions.newBuilder(); } } diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreUtils.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreUtils.java index ae1c7e07d..7ca92872f 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreUtils.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreUtils.java @@ -17,6 +17,7 @@ package com.google.cloud.datastore; import com.google.api.core.InternalApi; +import com.google.cloud.NoCredentials; import com.google.common.base.Strings; import java.net.InetAddress; import java.net.URL; @@ -24,6 +25,11 @@ @InternalApi public class DatastoreUtils { + public static boolean isEmulator(DatastoreOptions datastoreOptions) { + return isLocalHost(datastoreOptions.getHost()) + || NoCredentials.getInstance().equals(datastoreOptions.getCredentials()); + } + public static boolean isLocalHost(String host) { if (Strings.isNullOrEmpty(host)) { return false; diff --git a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/spi/v1/GrpcDatastoreRpc.java b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/spi/v1/GrpcDatastoreRpc.java index ffcab0560..3d9aebc68 100644 --- a/google-cloud-datastore/src/main/java/com/google/cloud/datastore/spi/v1/GrpcDatastoreRpc.java +++ b/google-cloud-datastore/src/main/java/com/google/cloud/datastore/spi/v1/GrpcDatastoreRpc.java @@ -16,7 +16,7 @@ package com.google.cloud.datastore.spi.v1; -import static com.google.cloud.datastore.DatastoreUtils.isLocalHost; +import static com.google.cloud.datastore.DatastoreUtils.isEmulator; import static com.google.cloud.datastore.DatastoreUtils.removeScheme; import static com.google.cloud.datastore.spi.v1.RpcUtils.retrySettingSetter; import static java.util.concurrent.TimeUnit.SECONDS; @@ -30,14 +30,12 @@ import com.google.api.gax.rpc.HeaderProvider; import com.google.api.gax.rpc.NoHeaderProvider; import com.google.api.gax.rpc.TransportChannel; -import com.google.cloud.NoCredentials; import com.google.cloud.ServiceOptions; import com.google.cloud.datastore.DatastoreException; import com.google.cloud.datastore.DatastoreOptions; import com.google.cloud.datastore.v1.DatastoreSettings; import com.google.cloud.datastore.v1.stub.DatastoreStubSettings; import com.google.cloud.datastore.v1.stub.GrpcDatastoreStub; -import com.google.cloud.grpc.GrpcTransportOptions; import com.google.common.base.Strings; import com.google.datastore.v1.AllocateIdsRequest; import com.google.datastore.v1.AllocateIdsResponse; @@ -69,7 +67,6 @@ public class GrpcDatastoreRpc implements DatastoreRpc { private boolean closed; public GrpcDatastoreRpc(DatastoreOptions datastoreOptions) throws IOException { - try { clientContext = isEmulator(datastoreOptions) @@ -146,11 +143,6 @@ public boolean isClosed() { return closed && datastoreStub.isShutdown(); } - private boolean isEmulator(DatastoreOptions datastoreOptions) { - return isLocalHost(datastoreOptions.getHost()) - || NoCredentials.getInstance().equals(datastoreOptions.getCredentials()); - } - private ClientContext getClientContextForEmulator(DatastoreOptions datastoreOptions) throws IOException { ManagedChannel managedChannel = @@ -177,11 +169,8 @@ private ClientContext getClientContext(DatastoreOptions datastoreOptions) throws DatastoreSettingsBuilder settingsBuilder = new DatastoreSettingsBuilder(DatastoreSettings.newBuilder().build()); - settingsBuilder.setCredentialsProvider( - GrpcTransportOptions.setUpCredentialsProvider(datastoreOptions)); - settingsBuilder.setTransportChannelProvider( - GrpcTransportOptions.setUpChannelProvider( - DatastoreSettings.defaultGrpcTransportProviderBuilder(), datastoreOptions)); + settingsBuilder.setCredentialsProvider(datastoreOptions.getCredentialsProvider()); + settingsBuilder.setTransportChannelProvider(datastoreOptions.getTransportChannelProvider()); settingsBuilder.setInternalHeaderProvider(internalHeaderProvider); settingsBuilder.setHeaderProvider( datastoreOptions.getMergedHeaderProvider(new NoHeaderProvider())); diff --git a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreOptionsTest.java b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreOptionsTest.java index 6281befe6..098ae3427 100644 --- a/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreOptionsTest.java +++ b/google-cloud-datastore/src/test/java/com/google/cloud/datastore/DatastoreOptionsTest.java @@ -22,11 +22,17 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.ChannelPoolSettings; +import com.google.api.gax.grpc.InstantiatingGrpcChannelProvider; +import com.google.cloud.NoCredentials; import com.google.cloud.datastore.spi.DatastoreRpcFactory; import com.google.cloud.datastore.spi.v1.DatastoreRpc; +import com.google.cloud.datastore.v1.DatastoreSettings; import com.google.cloud.grpc.GrpcTransportOptions; import com.google.cloud.http.HttpTransportOptions; import org.easymock.EasyMock; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -48,7 +54,9 @@ public void setUp() { .setServiceRpcFactory(datastoreRpcFactory) .setProjectId(PROJECT_ID) .setDatabaseId(DATABASE_ID) + .setCredentials(NoCredentials.getInstance()) .setHost("http://localhost:" + PORT); + EasyMock.expect(datastoreRpcFactory.create(EasyMock.anyObject(DatastoreOptions.class))) .andReturn(datastoreRpc) .anyTimes(); @@ -81,6 +89,51 @@ public void testDatastore() { assertSame(datastoreRpc, options.build().getRpc()); } + @Test + public void testCustomChannelAndCredentials() { + NoCredentialsProvider noCredentialsProvider = NoCredentialsProvider.create(); + InstantiatingGrpcChannelProvider channelProvider = + DatastoreSettings.defaultGrpcTransportProviderBuilder() + .setChannelPoolSettings( + ChannelPoolSettings.builder() + .setInitialChannelCount(10) + .setMaxChannelCount(20) + .build()) + .build(); + DatastoreOptions datastoreOptions = + DatastoreOptions.newBuilder() + .setServiceRpcFactory(datastoreRpcFactory) + .setProjectId(PROJECT_ID) + .setDatabaseId(DATABASE_ID) + .setChannelProvider(channelProvider) + .setCredentialsProvider(noCredentialsProvider) + .setHost("http://localhost:" + PORT) + .build(); + assertEquals(datastoreOptions.getTransportChannelProvider(), channelProvider); + assertEquals(datastoreOptions.getCredentialsProvider(), noCredentialsProvider); + } + + @Test + public void testInvalidConfigForHttp() { + DatastoreOptions.Builder options = + DatastoreOptions.newBuilder() + .setServiceRpcFactory(datastoreRpcFactory) + .setProjectId(PROJECT_ID) + .setDatabaseId(DATABASE_ID) + .setTransportOptions(HttpTransportOptions.newBuilder().build()) + .setChannelProvider( + DatastoreSettings.defaultGrpcTransportProviderBuilder() + .setChannelPoolSettings( + ChannelPoolSettings.builder() + .setInitialChannelCount(10) + .setMaxChannelCount(20) + .build()) + .build()) + .setCredentialsProvider(NoCredentialsProvider.create()) + .setHost("http://localhost:" + PORT); + Assert.assertThrows(IllegalArgumentException.class, options::build); + } + @Test public void testTransport() { // default grpc transport @@ -93,6 +146,8 @@ public void testTransport() { .setProjectId(PROJECT_ID) .build(); assertThat(httpDatastoreOptions.getTransportOptions()).isInstanceOf(HttpTransportOptions.class); + assertThat(httpDatastoreOptions.getCredentialsProvider()).isNull(); + assertThat(httpDatastoreOptions.getTransportChannelProvider()).isNull(); // custom grpc transport DatastoreOptions grpcDatastoreOptions =