diff --git a/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/ChannelPool.java b/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/ChannelPool.java
index df3888dfc9..c3e26dc4e2 100644
--- a/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/ChannelPool.java
+++ b/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/ChannelPool.java
@@ -68,7 +68,7 @@
* Package-private for internal use.
*/
class ChannelPool extends ManagedChannel {
- private static final Logger LOG = Logger.getLogger(ChannelPool.class.getName());
+ @VisibleForTesting static final Logger LOG = Logger.getLogger(ChannelPool.class.getName());
private static final Duration REFRESH_PERIOD = Duration.ofMinutes(50);
private final ChannelPoolSettings settings;
@@ -421,9 +421,25 @@ private Entry getEntry(int affinity) {
}
/** Bundles a gRPC {@link ManagedChannel} with some usage accounting. */
- private static class Entry {
+ static class Entry {
private final ManagedChannel channel;
- private final AtomicInteger outstandingRpcs = new AtomicInteger(0);
+
+ /**
+ * The primary purpose of keeping a count for outstanding RPCs is to track when a channel is
+ * safe to close. In grpc, initialization & starting of rpcs is split between 2 methods:
+ * Channel#newCall() and ClientCall#start. gRPC already has a mechanism to safely close channels
+ * that have rpcs that have been started. However, it does not protect calls that have been
+ * created but not started. In the sequence: Channel#newCall() Channel#shutdown()
+ * ClientCall#Start(), gRpc will error out the call telling the caller that the channel is
+ * shutdown.
+ *
+ *
Hence, the increment of outstanding RPCs has to happen when the ClientCall is initialized,
+ * as part of Channel#newCall(), not after the ClientCall is started. The decrement of
+ * outstanding RPCs has to happen when the ClientCall is closed or the ClientCall failed to
+ * start.
+ */
+ @VisibleForTesting final AtomicInteger outstandingRpcs = new AtomicInteger(0);
+
private final AtomicInteger maxOutstanding = new AtomicInteger();
// Flag that the channel should be closed once all of the outstanding RPC complete.
@@ -470,7 +486,7 @@ private boolean retain() {
private void release() {
int newCount = outstandingRpcs.decrementAndGet();
if (newCount < 0) {
- throw new IllegalStateException("Bug: reference count is negative!: " + newCount);
+ LOG.log(Level.WARNING, "Bug! Reference count is negative (" + newCount + ")!");
}
// Must check outstandingRpcs after shutdownRequested (in reverse order of retain()) to ensure
@@ -526,6 +542,8 @@ public ClientCall newCall(
static class ReleasingClientCall extends SimpleForwardingClientCall {
@Nullable private CancellationException cancellationException;
final Entry entry;
+ private final AtomicBoolean wasClosed = new AtomicBoolean();
+ private final AtomicBoolean wasReleased = new AtomicBoolean();
public ReleasingClientCall(ClientCall delegate, Entry entry) {
super(delegate);
@@ -542,17 +560,35 @@ public void start(Listener responseListener, Metadata headers) {
new SimpleForwardingClientCallListener(responseListener) {
@Override
public void onClose(Status status, Metadata trailers) {
+ if (!wasClosed.compareAndSet(false, true)) {
+ LOG.log(
+ Level.WARNING,
+ "Call is being closed more than once. Please make sure that onClose() is not being manually called.");
+ return;
+ }
try {
super.onClose(status, trailers);
} finally {
- entry.release();
+ if (wasReleased.compareAndSet(false, true)) {
+ entry.release();
+ } else {
+ LOG.log(
+ Level.WARNING,
+ "Entry was released before the call is closed. This may be due to an exception on start of the call.");
+ }
}
}
},
headers);
} catch (Exception e) {
// In case start failed, make sure to release
- entry.release();
+ if (wasReleased.compareAndSet(false, true)) {
+ entry.release();
+ } else {
+ LOG.log(
+ Level.WARNING,
+ "The entry is already released. This indicates that onClose() has already been called previously");
+ }
throw e;
}
}
diff --git a/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProvider.java b/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProvider.java
index 06d0c18e51..4e7a654f7e 100644
--- a/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProvider.java
+++ b/gax-java/gax-grpc/src/main/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProvider.java
@@ -64,6 +64,8 @@
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.annotation.Nullable;
import javax.net.ssl.KeyManagerFactory;
import org.threeten.bp.Duration;
@@ -82,6 +84,9 @@
*/
@InternalExtensionOnly
public final class InstantiatingGrpcChannelProvider implements TransportChannelProvider {
+ @VisibleForTesting
+ static final Logger LOG = Logger.getLogger(InstantiatingGrpcChannelProvider.class.getName());
+
private static final String DIRECT_PATH_ENV_DISABLE_DIRECT_PATH =
"GOOGLE_CLOUD_DISABLE_DIRECT_PATH";
private static final String DIRECT_PATH_ENV_ENABLE_XDS = "GOOGLE_CLOUD_ENABLE_DIRECT_PATH_XDS";
@@ -140,6 +145,7 @@ private InstantiatingGrpcChannelProvider(Builder builder) {
builder.directPathServiceConfig == null
? getDefaultDirectPathServiceConfig()
: builder.directPathServiceConfig;
+ logDirectPathMisconfig();
}
/**
@@ -266,6 +272,33 @@ boolean isDirectPathXdsEnabled() {
return false;
}
+ private void logDirectPathMisconfig() {
+ if (isDirectPathXdsEnabled()) {
+ // Case 1: does not enable DirectPath
+ if (!isDirectPathEnabled()) {
+ LOG.log(
+ Level.WARNING,
+ "DirectPath is misconfigured. Please set the attemptDirectPath option along with the"
+ + " attemptDirectPathXds option.");
+ } else {
+ // Case 2: credential is not correctly set
+ if (!isNonDefaultServiceAccountAllowed()) {
+ LOG.log(
+ Level.WARNING,
+ "DirectPath is misconfigured. Please make sure the credential is an instance of "
+ + ComputeEngineCredentials.class.getName()
+ + " .");
+ }
+ // Case 3: not running on GCE
+ if (!isOnComputeEngine()) {
+ LOG.log(
+ Level.WARNING,
+ "DirectPath is misconfigured. DirectPath is only available in a GCE environment.");
+ }
+ }
+ }
+ }
+
private boolean isNonDefaultServiceAccountAllowed() {
if (allowNonDefaultServiceAccount != null && allowNonDefaultServiceAccount) {
return true;
@@ -275,6 +308,7 @@ private boolean isNonDefaultServiceAccountAllowed() {
// DirectPath should only be used on Compute Engine.
// Notice Windows is supported for now.
+ @VisibleForTesting
static boolean isOnComputeEngine() {
String osName = System.getProperty("os.name");
if ("Linux".equals(osName)) {
diff --git a/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/ChannelPoolTest.java b/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/ChannelPoolTest.java
index c38d98e91f..173528d6e2 100644
--- a/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/ChannelPoolTest.java
+++ b/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/ChannelPoolTest.java
@@ -29,17 +29,20 @@
*/
package com.google.api.gax.grpc;
+import static com.google.api.gax.grpc.testing.FakeServiceGrpc.METHOD_RECOGNIZE;
import static com.google.api.gax.grpc.testing.FakeServiceGrpc.METHOD_SERVER_STREAMING_RECOGNIZE;
import static com.google.common.truth.Truth.assertThat;
+import com.google.api.core.ApiFuture;
import com.google.api.gax.grpc.testing.FakeChannelFactory;
import com.google.api.gax.grpc.testing.FakeMethodDescriptor;
-import com.google.api.gax.grpc.testing.FakeServiceGrpc;
import com.google.api.gax.rpc.ClientContext;
import com.google.api.gax.rpc.ResponseObserver;
import com.google.api.gax.rpc.ServerStreamingCallSettings;
import com.google.api.gax.rpc.ServerStreamingCallable;
import com.google.api.gax.rpc.StreamController;
+import com.google.api.gax.rpc.UnaryCallSettings;
+import com.google.api.gax.rpc.UnaryCallable;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
@@ -63,6 +66,9 @@
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+import java.util.stream.Collectors;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
@@ -117,7 +123,7 @@ public void testRoundRobin() throws IOException {
private void verifyTargetChannel(
ChannelPool pool, List channels, ManagedChannel targetChannel) {
- MethodDescriptor methodDescriptor = FakeServiceGrpc.METHOD_RECOGNIZE;
+ MethodDescriptor methodDescriptor = METHOD_RECOGNIZE;
CallOptions callOptions = CallOptions.DEFAULT;
@SuppressWarnings("unchecked")
ClientCall expectedClientCall = Mockito.mock(ClientCall.class);
@@ -143,7 +149,7 @@ public void ensureEvenDistribution() throws InterruptedException, IOException {
final ManagedChannel[] channels = new ManagedChannel[numChannels];
final AtomicInteger[] counts = new AtomicInteger[numChannels];
- final MethodDescriptor methodDescriptor = FakeServiceGrpc.METHOD_RECOGNIZE;
+ final MethodDescriptor methodDescriptor = METHOD_RECOGNIZE;
final CallOptions callOptions = CallOptions.DEFAULT;
@SuppressWarnings("unchecked")
final ClientCall clientCall = Mockito.mock(ClientCall.class);
@@ -472,8 +478,7 @@ public void channelCountShouldNotChangeWhenOutstandingRpcsAreWithinLimits() thro
// Start the minimum number of
for (int i = 0; i < 2; i++) {
ClientCalls.futureUnaryCall(
- pool.newCall(FakeServiceGrpc.METHOD_RECOGNIZE, CallOptions.DEFAULT),
- Color.getDefaultInstance());
+ pool.newCall(METHOD_RECOGNIZE, CallOptions.DEFAULT), Color.getDefaultInstance());
}
pool.resize();
assertThat(pool.entries.get()).hasSize(2);
@@ -481,14 +486,13 @@ public void channelCountShouldNotChangeWhenOutstandingRpcsAreWithinLimits() thro
// Add enough RPCs to be just at the brink of expansion
for (int i = startedCalls.size(); i < 4; i++) {
ClientCalls.futureUnaryCall(
- pool.newCall(FakeServiceGrpc.METHOD_RECOGNIZE, CallOptions.DEFAULT),
- Color.getDefaultInstance());
+ pool.newCall(METHOD_RECOGNIZE, CallOptions.DEFAULT), Color.getDefaultInstance());
}
pool.resize();
assertThat(pool.entries.get()).hasSize(2);
// Add another RPC to push expansion
- pool.newCall(FakeServiceGrpc.METHOD_RECOGNIZE, CallOptions.DEFAULT);
+ pool.newCall(METHOD_RECOGNIZE, CallOptions.DEFAULT);
pool.resize();
assertThat(pool.entries.get()).hasSize(4); // += ChannelPool::MAX_RESIZE_DELTA
assertThat(startedCalls).hasSize(5);
@@ -593,8 +597,7 @@ public void removedActiveChannelsAreShutdown() throws Exception {
// Start 2 RPCs
for (int i = 0; i < 2; i++) {
ClientCalls.futureUnaryCall(
- pool.newCall(FakeServiceGrpc.METHOD_RECOGNIZE, CallOptions.DEFAULT),
- Color.getDefaultInstance());
+ pool.newCall(METHOD_RECOGNIZE, CallOptions.DEFAULT), Color.getDefaultInstance());
}
// Complete the first one
@SuppressWarnings("unchecked")
@@ -663,4 +666,74 @@ public void onComplete() {}
assertThat(e.getCause()).isInstanceOf(CancellationException.class);
assertThat(e.getMessage()).isEqualTo("Call is already cancelled");
}
+
+ @Test
+ public void testDoubleRelease() throws Exception {
+ FakeLogHandler logHandler = new FakeLogHandler();
+ ChannelPool.LOG.addHandler(logHandler);
+
+ try {
+ // Create a fake channel pool thats backed by mock channels that simply record invocations
+ ClientCall mockClientCall = Mockito.mock(ClientCall.class);
+ ManagedChannel fakeChannel = Mockito.mock(ManagedChannel.class);
+ Mockito.when(fakeChannel.newCall(Mockito.any(), Mockito.any())).thenReturn(mockClientCall);
+ ChannelPoolSettings channelPoolSettings = ChannelPoolSettings.staticallySized(1);
+ ChannelFactory factory = new FakeChannelFactory(ImmutableList.of(fakeChannel));
+
+ pool = ChannelPool.create(channelPoolSettings, factory);
+
+ // Construct a fake callable to use the channel pool
+ ClientContext context =
+ ClientContext.newBuilder()
+ .setTransportChannel(GrpcTransportChannel.create(pool))
+ .setDefaultCallContext(GrpcCallContext.of(pool, CallOptions.DEFAULT))
+ .build();
+
+ UnaryCallSettings settings =
+ UnaryCallSettings.newUnaryCallSettingsBuilder().build();
+ UnaryCallable callable =
+ GrpcCallableFactory.createUnaryCallable(
+ GrpcCallSettings.create(METHOD_RECOGNIZE), settings, context);
+
+ // Start the RPC
+ ApiFuture rpcFuture =
+ callable.futureCall(Color.getDefaultInstance(), context.getDefaultCallContext());
+
+ // Get the server side listener and intentionally close it twice
+ ArgumentCaptor> clientCallListenerCaptor =
+ ArgumentCaptor.forClass(ClientCall.Listener.class);
+ Mockito.verify(mockClientCall).start(clientCallListenerCaptor.capture(), Mockito.any());
+ clientCallListenerCaptor.getValue().onClose(Status.INTERNAL, new Metadata());
+ clientCallListenerCaptor.getValue().onClose(Status.UNKNOWN, new Metadata());
+
+ // Ensure that the channel pool properly logged the double call and kept the refCount correct
+ assertThat(logHandler.getAllMessages())
+ .contains(
+ "Call is being closed more than once. Please make sure that onClose() is not being manually called.");
+ assertThat(pool.entries.get()).hasSize(1);
+ ChannelPool.Entry entry = pool.entries.get().get(0);
+ assertThat(entry.outstandingRpcs.get()).isEqualTo(0);
+ } finally {
+ ChannelPool.LOG.removeHandler(logHandler);
+ }
+ }
+
+ private static class FakeLogHandler extends Handler {
+ List records = new ArrayList<>();
+
+ @Override
+ public void publish(LogRecord record) {
+ records.add(record);
+ }
+
+ @Override
+ public void flush() {}
+
+ @Override
+ public void close() throws SecurityException {}
+
+ List getAllMessages() {
+ return records.stream().map(LogRecord::getMessage).collect(Collectors.toList());
+ }
+ }
}
diff --git a/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProviderTest.java b/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProviderTest.java
index d58a3b56b6..edd7a73768 100644
--- a/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProviderTest.java
+++ b/gax-java/gax-grpc/src/test/java/com/google/api/gax/grpc/InstantiatingGrpcChannelProviderTest.java
@@ -56,6 +56,9 @@
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.logging.Handler;
+import java.util.logging.LogRecord;
+import java.util.stream.Collectors;
import javax.annotation.Nullable;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -503,4 +506,70 @@ protected Object getMtlsObjectFromTransportChannel(MtlsProvider provider)
.build();
return channelProvider.createMtlsChannelCredentials();
}
+
+ @Test
+ public void testLogDirectPathMisconfigAttrempDirectPathNotSet() {
+ FakeLogHandler logHandler = new FakeLogHandler();
+ InstantiatingGrpcChannelProvider.LOG.addHandler(logHandler);
+ InstantiatingGrpcChannelProvider provider =
+ InstantiatingGrpcChannelProvider.newBuilder().setAttemptDirectPathXds().build();
+ assertThat(logHandler.getAllMessages())
+ .contains(
+ "DirectPath is misconfigured. Please set the attemptDirectPath option along with the"
+ + " attemptDirectPathXds option.");
+ InstantiatingGrpcChannelProvider.LOG.removeHandler(logHandler);
+ }
+
+ @Test
+ public void testLogDirectPathMisconfigWrongCredential() {
+ FakeLogHandler logHandler = new FakeLogHandler();
+ InstantiatingGrpcChannelProvider.LOG.addHandler(logHandler);
+ InstantiatingGrpcChannelProvider provider =
+ InstantiatingGrpcChannelProvider.newBuilder()
+ .setAttemptDirectPathXds()
+ .setAttemptDirectPath(true)
+ .build();
+ assertThat(logHandler.getAllMessages())
+ .contains(
+ "DirectPath is misconfigured. Please make sure the credential is an instance of"
+ + " com.google.auth.oauth2.ComputeEngineCredentials .");
+ InstantiatingGrpcChannelProvider.LOG.removeHandler(logHandler);
+ }
+
+ @Test
+ public void testLogDirectPathMisconfigNotOnGCE() {
+ FakeLogHandler logHandler = new FakeLogHandler();
+ InstantiatingGrpcChannelProvider.LOG.addHandler(logHandler);
+ InstantiatingGrpcChannelProvider provider =
+ InstantiatingGrpcChannelProvider.newBuilder()
+ .setAttemptDirectPathXds()
+ .setAttemptDirectPath(true)
+ .setAllowNonDefaultServiceAccount(true)
+ .build();
+ if (!InstantiatingGrpcChannelProvider.isOnComputeEngine()) {
+ assertThat(logHandler.getAllMessages())
+ .contains(
+ "DirectPath is misconfigured. DirectPath is only available in a GCE environment.");
+ }
+ InstantiatingGrpcChannelProvider.LOG.removeHandler(logHandler);
+ }
+
+ private static class FakeLogHandler extends Handler {
+ List records = new ArrayList<>();
+
+ @Override
+ public void publish(LogRecord record) {
+ records.add(record);
+ }
+
+ @Override
+ public void flush() {}
+
+ @Override
+ public void close() throws SecurityException {}
+
+ List getAllMessages() {
+ return records.stream().map(LogRecord::getMessage).collect(Collectors.toList());
+ }
+ }
}
diff --git a/gax-java/gax-httpjson/pom.xml b/gax-java/gax-httpjson/pom.xml
index 1e49b17718..bf3b7bb0ff 100644
--- a/gax-java/gax-httpjson/pom.xml
+++ b/gax-java/gax-httpjson/pom.xml
@@ -3,7 +3,7 @@
4.0.0
gax-httpjson
- 2.35.0
+ 2.36.0
jar
GAX (Google Api eXtensions) for Java (HTTP JSON)
Google Api eXtensions for Java (HTTP JSON)
@@ -11,7 +11,7 @@
com.google.api
gax-parent
- 2.35.0
+ 2.36.0
diff --git a/gax-java/gax/pom.xml b/gax-java/gax/pom.xml
index 79f095f9f1..899ad0c6e9 100644
--- a/gax-java/gax/pom.xml
+++ b/gax-java/gax/pom.xml
@@ -3,7 +3,7 @@
4.0.0
gax
- 2.35.0
+ 2.36.0
jar
GAX (Google Api eXtensions) for Java (Core)
Google Api eXtensions for Java (Core)
@@ -11,7 +11,7 @@
com.google.api
gax-parent
- 2.35.0
+ 2.36.0
diff --git a/gax-java/pom.xml b/gax-java/pom.xml
index d2a0fb779d..7ccf21d5eb 100644
--- a/gax-java/pom.xml
+++ b/gax-java/pom.xml
@@ -4,14 +4,14 @@
com.google.api
gax-parent
pom
- 2.35.0
+ 2.36.0
GAX (Google Api eXtensions) for Java (Parent)
Google Api eXtensions for Java (Parent)
com.google.api
gapic-generator-java-pom-parent
- 2.27.0
+ 2.28.0
../gapic-generator-java-pom-parent
@@ -50,7 +50,7 @@
com.google.api
api-common
- 2.18.0
+ 2.19.0
com.google.auth
@@ -108,24 +108,24 @@
com.google.api
gax
- 2.35.0
+ 2.36.0
com.google.api
gax
- 2.35.0
+ 2.36.0
test-jar
testlib
com.google.api.grpc
proto-google-common-protos
- 2.26.0
+ 2.27.0
com.google.api.grpc
grpc-google-common-protos
- 2.26.0
+ 2.27.0
io.grpc
@@ -142,7 +142,7 @@
org.graalvm.sdk
graal-sdk
- 22.3.2
+ ${graal-sdk.version}
com.google.http-client
@@ -176,7 +176,7 @@
com.google.truth
truth
- 1.1.3
+ 1.1.5
org.checkerframework
diff --git a/java-common-protos/grpc-google-common-protos/pom.xml b/java-common-protos/grpc-google-common-protos/pom.xml
index 07772806e8..0fa050644f 100644
--- a/java-common-protos/grpc-google-common-protos/pom.xml
+++ b/java-common-protos/grpc-google-common-protos/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-common-protos
- 2.26.0
+ 2.27.0
grpc-google-common-protos
GRPC library for grpc-google-common-protos
com.google.api.grpc
google-common-protos-parent
- 2.26.0
+ 2.27.0
diff --git a/java-common-protos/pom.xml b/java-common-protos/pom.xml
index 6afe0ac039..3639996176 100644
--- a/java-common-protos/pom.xml
+++ b/java-common-protos/pom.xml
@@ -4,7 +4,7 @@
com.google.api.grpc
google-common-protos-parent
pom
- 2.26.0
+ 2.27.0
Google Common Protos Parent
Java idiomatic client for Google Cloud Platform services.
@@ -13,7 +13,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.27.0
+ 2.28.0
../gapic-generator-java-pom-parent
@@ -68,7 +68,7 @@
com.google.api.grpc
grpc-google-common-protos
- 2.26.0
+ 2.27.0
io.grpc
@@ -80,7 +80,7 @@
com.google.api.grpc
proto-google-common-protos
- 2.26.0
+ 2.27.0
com.google.guava
@@ -112,7 +112,7 @@
org.apache.maven.plugins
maven-project-info-reports-plugin
- 3.4.2
+ 3.4.5
@@ -139,7 +139,7 @@
org.apache.maven.plugins
maven-javadoc-plugin
- 3.5.0
+ 3.6.0
html
diff --git a/java-common-protos/proto-google-common-protos/pom.xml b/java-common-protos/proto-google-common-protos/pom.xml
index 1b5017a0cc..7efaac4d8e 100644
--- a/java-common-protos/proto-google-common-protos/pom.xml
+++ b/java-common-protos/proto-google-common-protos/pom.xml
@@ -3,13 +3,13 @@
4.0.0
com.google.api.grpc
proto-google-common-protos
- 2.26.0
+ 2.27.0
proto-google-common-protos
PROTO library for proto-google-common-protos
com.google.api.grpc
google-common-protos-parent
- 2.26.0
+ 2.27.0
diff --git a/java-core/google-cloud-core-bom/pom.xml b/java-core/google-cloud-core-bom/pom.xml
index a0effb59e6..b46addb415 100644
--- a/java-core/google-cloud-core-bom/pom.xml
+++ b/java-core/google-cloud-core-bom/pom.xml
@@ -3,13 +3,13 @@
4.0.0
com.google.cloud
google-cloud-core-bom
- 2.25.0
+ 2.26.0
pom
com.google.api
gapic-generator-java-pom-parent
- 2.27.0
+ 2.28.0
../../gapic-generator-java-pom-parent
@@ -23,17 +23,17 @@
com.google.cloud
google-cloud-core
- 2.25.0
+ 2.26.0
com.google.cloud
google-cloud-core-grpc
- 2.25.0
+ 2.26.0
com.google.cloud
google-cloud-core-http
- 2.25.0
+ 2.26.0
diff --git a/java-core/google-cloud-core-grpc/pom.xml b/java-core/google-cloud-core-grpc/pom.xml
index 1c9fbadcdc..b8ff82c444 100644
--- a/java-core/google-cloud-core-grpc/pom.xml
+++ b/java-core/google-cloud-core-grpc/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-core-grpc
- 2.25.0
+ 2.26.0
jar
Google Cloud Core gRPC
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-core-parent
- 2.25.0
+ 2.26.0
google-cloud-core-grpc
diff --git a/java-core/google-cloud-core-http/pom.xml b/java-core/google-cloud-core-http/pom.xml
index 5e981c6d00..3ea1743160 100644
--- a/java-core/google-cloud-core-http/pom.xml
+++ b/java-core/google-cloud-core-http/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-core-http
- 2.25.0
+ 2.26.0
jar
Google Cloud Core HTTP
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-core-parent
- 2.25.0
+ 2.26.0
google-cloud-core-http
diff --git a/java-core/google-cloud-core/pom.xml b/java-core/google-cloud-core/pom.xml
index bcac4a227f..2b1fc88dc2 100644
--- a/java-core/google-cloud-core/pom.xml
+++ b/java-core/google-cloud-core/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
google-cloud-core
- 2.25.0
+ 2.26.0
jar
Google Cloud Core
@@ -12,7 +12,7 @@
com.google.cloud
google-cloud-core-parent
- 2.25.0
+ 2.26.0
google-cloud-core
diff --git a/java-core/pom.xml b/java-core/pom.xml
index 411fb57028..4747372e94 100644
--- a/java-core/pom.xml
+++ b/java-core/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-core-parent
pom
- 2.25.0
+ 2.26.0
Google Cloud Core Parent
Java idiomatic client for Google Cloud Platform services.
@@ -13,7 +13,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.27.0
+ 2.28.0
../gapic-generator-java-pom-parent
@@ -33,7 +33,7 @@
com.google.cloud
google-cloud-shared-dependencies
- 3.17.0
+ 3.18.0
pom
import
@@ -47,7 +47,7 @@
com.google.truth
truth
- 1.1.3
+ 1.1.5
test
@@ -59,7 +59,7 @@
org.easymock
easymock
- 5.1.0
+ 5.2.0
test
diff --git a/java-iam/grpc-google-iam-v1/pom.xml b/java-iam/grpc-google-iam-v1/pom.xml
index b436c67acc..52a65be874 100644
--- a/java-iam/grpc-google-iam-v1/pom.xml
+++ b/java-iam/grpc-google-iam-v1/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-iam-v1
- 1.21.0
+ 1.22.0
grpc-google-iam-v1
GRPC library for grpc-google-iam-v1
com.google.cloud
google-iam-parent
- 1.21.0
+ 1.22.0
diff --git a/java-iam/grpc-google-iam-v2/pom.xml b/java-iam/grpc-google-iam-v2/pom.xml
index c3a9b02fd3..24b5668481 100644
--- a/java-iam/grpc-google-iam-v2/pom.xml
+++ b/java-iam/grpc-google-iam-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-iam-v2
- 1.21.0
+ 1.22.0
grpc-google-iam-v2
GRPC library for proto-google-iam-v2
com.google.cloud
google-iam-parent
- 1.21.0
+ 1.22.0
diff --git a/java-iam/grpc-google-iam-v2beta/pom.xml b/java-iam/grpc-google-iam-v2beta/pom.xml
index 03b2a1e514..d5f11d280d 100644
--- a/java-iam/grpc-google-iam-v2beta/pom.xml
+++ b/java-iam/grpc-google-iam-v2beta/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
grpc-google-iam-v2beta
- 1.21.0
+ 1.22.0
grpc-google-iam-v2beta
GRPC library for proto-google-iam-v1
com.google.cloud
google-iam-parent
- 1.21.0
+ 1.22.0
diff --git a/java-iam/pom.xml b/java-iam/pom.xml
index 95cd78475d..a281d9952c 100644
--- a/java-iam/pom.xml
+++ b/java-iam/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-iam-parent
pom
- 1.21.0
+ 1.22.0
Google IAM Parent
Java idiomatic client for Google Cloud Platform services.
@@ -13,7 +13,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.27.0
+ 2.28.0
../gapic-generator-java-pom-parent
@@ -81,44 +81,44 @@
com.google.api
gax-bom
- 2.35.0
+ 2.36.0
pom
import
com.google.api.grpc
proto-google-iam-v2
- 1.21.0
+ 1.22.0
com.google.api.grpc
grpc-google-iam-v2
- 1.21.0
+ 1.22.0
com.google.api.grpc
proto-google-common-protos
- 2.26.0
+ 2.27.0
com.google.api.grpc
proto-google-iam-v2beta
- 1.21.0
+ 1.22.0
com.google.api.grpc
grpc-google-iam-v1
- 1.21.0
+ 1.22.0
com.google.api.grpc
grpc-google-iam-v2beta
- 1.21.0
+ 1.22.0
com.google.api.grpc
proto-google-iam-v1
- 1.21.0
+ 1.22.0
javax.annotation
@@ -149,7 +149,7 @@
org.apache.maven.plugins
maven-project-info-reports-plugin
- 3.4.2
+ 3.4.5
@@ -176,7 +176,7 @@
org.apache.maven.plugins
maven-javadoc-plugin
- 3.5.0
+ 3.6.0
html
diff --git a/java-iam/proto-google-iam-v1/pom.xml b/java-iam/proto-google-iam-v1/pom.xml
index 5d38693800..ad9fd4097a 100644
--- a/java-iam/proto-google-iam-v1/pom.xml
+++ b/java-iam/proto-google-iam-v1/pom.xml
@@ -3,13 +3,13 @@
4.0.0
com.google.api.grpc
proto-google-iam-v1
- 1.21.0
+ 1.22.0
proto-google-iam-v1
PROTO library for proto-google-iam-v1
com.google.cloud
google-iam-parent
- 1.21.0
+ 1.22.0
diff --git a/java-iam/proto-google-iam-v2/pom.xml b/java-iam/proto-google-iam-v2/pom.xml
index 9db874d29e..98798aab62 100644
--- a/java-iam/proto-google-iam-v2/pom.xml
+++ b/java-iam/proto-google-iam-v2/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-iam-v2
- 1.21.0
+ 1.22.0
proto-google-iam-v2
Proto library for proto-google-iam-v1
com.google.cloud
google-iam-parent
- 1.21.0
+ 1.22.0
diff --git a/java-iam/proto-google-iam-v2beta/pom.xml b/java-iam/proto-google-iam-v2beta/pom.xml
index 54efb12a08..8cf5dd86c9 100644
--- a/java-iam/proto-google-iam-v2beta/pom.xml
+++ b/java-iam/proto-google-iam-v2beta/pom.xml
@@ -4,13 +4,13 @@
4.0.0
com.google.api.grpc
proto-google-iam-v2beta
- 1.21.0
+ 1.22.0
proto-google-iam-v2beta
Proto library for proto-google-iam-v1
com.google.cloud
google-iam-parent
- 1.21.0
+ 1.22.0
diff --git a/java-shared-dependencies/dependency-convergence-check/pom.xml b/java-shared-dependencies/dependency-convergence-check/pom.xml
index f578b71b06..5719364326 100644
--- a/java-shared-dependencies/dependency-convergence-check/pom.xml
+++ b/java-shared-dependencies/dependency-convergence-check/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.google.cloud
shared-dependencies-dependency-convergence-test
- 3.17.0
+ 3.18.0
Dependency convergence test for certain artifacts in Google Cloud Shared Dependencies
An dependency convergence test case for the shared dependencies BOM. A failure of this test case means
diff --git a/java-shared-dependencies/first-party-dependencies/pom.xml b/java-shared-dependencies/first-party-dependencies/pom.xml
index 8dd9bb36cf..1c61eb8faa 100644
--- a/java-shared-dependencies/first-party-dependencies/pom.xml
+++ b/java-shared-dependencies/first-party-dependencies/pom.xml
@@ -6,7 +6,7 @@
com.google.cloud
first-party-dependencies
pom
- 3.17.0
+ 3.18.0
Google Cloud First-party Shared Dependencies
Shared first-party dependencies for Google Cloud Java libraries.
@@ -15,7 +15,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.8
+ 1.6.0
@@ -33,7 +33,7 @@
com.google.api
gapic-generator-java-bom
- 2.27.0
+ 2.28.0
pom
import
@@ -45,7 +45,7 @@
com.google.cloud
google-cloud-core-bom
- 2.25.0
+ 2.26.0
pom
import
@@ -69,13 +69,13 @@
com.google.cloud
google-cloud-core
- 2.25.0
+ 2.26.0
test-jar
com.google.cloud
google-cloud-core
- 2.25.0
+ 2.26.0
tests
diff --git a/java-shared-dependencies/pom.xml b/java-shared-dependencies/pom.xml
index 2094c9cbb0..d9074d7db6 100644
--- a/java-shared-dependencies/pom.xml
+++ b/java-shared-dependencies/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
google-cloud-shared-dependencies
pom
- 3.17.0
+ 3.18.0
first-party-dependencies
third-party-dependencies
@@ -17,7 +17,7 @@
com.google.api
gapic-generator-java-pom-parent
- 2.27.0
+ 2.28.0
../gapic-generator-java-pom-parent
@@ -31,14 +31,14 @@
com.google.cloud
first-party-dependencies
- 3.17.0
+ 3.18.0
pom
import
com.google.cloud
third-party-dependencies
- 3.17.0
+ 3.18.0
pom
import
diff --git a/java-shared-dependencies/third-party-dependencies/pom.xml b/java-shared-dependencies/third-party-dependencies/pom.xml
index 57a5a8db43..65e761dcd9 100644
--- a/java-shared-dependencies/third-party-dependencies/pom.xml
+++ b/java-shared-dependencies/third-party-dependencies/pom.xml
@@ -6,7 +6,7 @@
com.google.cloud
third-party-dependencies
pom
- 3.17.0
+ 3.18.0
Google Cloud Third-party Shared Dependencies
Shared third-party dependencies for Google Cloud Java libraries.
@@ -15,7 +15,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.8
+ 1.6.0
@@ -28,13 +28,13 @@
1.23
0.31.1
3.0.2
- 2.20.0
- 2.15.2
- 1.15
+ 2.22.0
+ 2.15.3
+ 1.16.0
4.4.16
4.5.14
- 3.33.0
+ 3.39.0
0.26.0
2.8
diff --git a/java-shared-dependencies/upper-bound-check/pom.xml b/java-shared-dependencies/upper-bound-check/pom.xml
index 878e1dd2e5..c5a82f6f15 100644
--- a/java-shared-dependencies/upper-bound-check/pom.xml
+++ b/java-shared-dependencies/upper-bound-check/pom.xml
@@ -4,7 +4,7 @@
com.google.cloud
shared-dependencies-upper-bound-test
pom
- 3.17.0
+ 3.18.0
Upper bound test for Google Cloud Shared Dependencies
An upper bound test case for the shared dependencies BOM. A failure of this test case means
@@ -16,7 +16,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.8
+ 1.6.0
@@ -30,7 +30,7 @@
com.google.cloud
google-cloud-shared-dependencies
- 3.17.0
+ 3.18.0
pom
import
diff --git a/library_generation/README.md b/library_generation/README.md
index 19f033e0a0..7a2fe32e3e 100644
--- a/library_generation/README.md
+++ b/library_generation/README.md
@@ -122,6 +122,24 @@ The default value is `true`.
Use `--rest_numeric_enums` to specify the value.
+### gapic_yaml (optional)
+One of GAPIC options passed to the generator.
+The default value is an empty string.
+
+Use `--gapic_yaml` to specify the value.
+
+### service_config (optional)
+One of GAPIC options passed to the generator.
+The default value is an empty string.
+
+Use `--service_config` to specify the value.
+
+### service_yaml (optional)
+One of GAPIC options passed to the generator.
+The default value is an empty string.
+
+Use `--service_yaml` to specify the value.
+
### include_samples (optional)
Whether generates code samples. The value is either `true` or `false`.
The default value is `true`.
diff --git a/library_generation/generate_library.sh b/library_generation/generate_library.sh
index 47931231ae..04e3fbe860 100755
--- a/library_generation/generate_library.sh
+++ b/library_generation/generate_library.sh
@@ -45,6 +45,18 @@ case $key in
rest_numeric_enums="$2"
shift
;;
+ --gapic_yaml)
+ gapic_yaml="$2"
+ shift
+ ;;
+ --service_config)
+ service_config="$2"
+ shift
+ ;;
+ --service_yaml)
+ service_yaml="$2"
+ shift
+ ;;
--include_samples)
include_samples="$2"
shift
@@ -89,6 +101,18 @@ if [ -z "${rest_numeric_enums}" ]; then
rest_numeric_enums="true"
fi
+if [ -z "${gapic_yaml}" ]; then
+ gapic_yaml=""
+fi
+
+if [ -z "${service_config}" ]; then
+ service_config=""
+fi
+
+if [ -z "${service_yaml}" ]; then
+ service_yaml=""
+fi
+
if [ -z "${include_samples}" ]; then
include_samples="true"
fi
@@ -107,7 +131,41 @@ mkdir -p "${output_folder}/${destination_path}"
# get a fixed order.
folder_name=$(extract_folder_name "${destination_path}")
pushd "${output_folder}"
-proto_files=$(find "${proto_path}" -type f -name "*.proto" | sort)
+find_depth=""
+case "${proto_path}" in
+ "google/api" | "google/cloud" | "google/iam/v1" | "google/rpc")
+ find_depth="-maxdepth 1"
+ ;;
+esac
+proto_files=$(find "${proto_path}" ${find_depth} -type f -name "*.proto" | sort)
+# include or exclude certain protos in grpc plugin and gapic generator java.
+case "${proto_path}" in
+ "google/cloud")
+ # this proto is excluded from //google/cloud:google-apps-script-type-java
+ removed_proto="google/cloud/common_resources.proto"
+ proto_files="${proto_files//${removed_proto}/}"
+ ;;
+ "google/cloud/aiplatform/v1beta1"*)
+ # this proto is excluded from //google/cloud/aiplatform/v1beta1/schema:schema_proto
+ removed_proto="google/cloud/aiplatform/v1beta1/schema/io_format.proto"
+ proto_files="${proto_files//${removed_proto}/}"
+ ;;
+ "google/cloud/filestore"*)
+ # this proto is included in //google/cloud/filestore/v1:google-cloud-filestore-v1-java
+ # and //google/cloud/filestore/v1beta1:google-cloud-filestore-v1-java
+ proto_files="${proto_files} google/cloud/common/operation_metadata.proto"
+ ;;
+ "google/cloud/oslogin"*)
+ # this proto is included in //google/cloud/oslogin/v1:google-cloud-oslogin-v1-java
+ # and //google/cloud/oslogin/v1beta1:google-cloud-oslogin-v1-java
+ proto_files="${proto_files} google/cloud/oslogin/common/common.proto"
+ ;;
+ "google/rpc")
+ # this proto is excluded from //google/rpc:google-rpc-java
+ removed_proto="google/rpc/http.proto"
+ proto_files="${proto_files//${removed_proto}/}"
+ ;;
+esac
# download gapic-generator-java, protobuf and grpc plugin.
download_tools "${gapic_generator_version}" "${protobuf_version}" "${grpc_version}" "${os_architecture}"
##################### Section 1 #####################
@@ -132,7 +190,7 @@ if [[ "${proto_only}" == "false" ]]; then
"$protoc_path"/protoc --experimental_allow_proto3_optional \
"--plugin=protoc-gen-java_gapic=${script_dir}/gapic-generator-java-wrapper" \
"--java_gapic_out=metadata:${destination_path}/java_gapic_srcjar_raw.srcjar.zip" \
- "--java_gapic_opt=$(get_gapic_opts)" \
+ "--java_gapic_opt=$(get_gapic_opts "${transport}" "${rest_numeric_enums}" "${gapic_yaml}" "${service_config}" "${service_yaml}")" \
${proto_files} ${gapic_additional_protos}
unzip -o -q "${destination_path}/java_gapic_srcjar_raw.srcjar.zip" -d "${destination_path}"
@@ -162,6 +220,22 @@ fi
##################### Section 3 #####################
# generate proto-*/
#####################################################
+# exclude certain protos to java compiler.
+case "${proto_path}" in
+ "google/cloud/aiplatform/v1beta1"*)
+ # these protos are excluded from //google/cloud/aiplatform/v1beta1:google-cloud-aiplatform-v1beta1-java
+ prefix="google/cloud/aiplatform/v1beta1/schema"
+ protos="${prefix}/annotation_payload.proto ${prefix}/annotation_spec_color.proto ${prefix}/data_item_payload.proto ${prefix}/dataset_metadata.proto ${prefix}/geometry.proto"
+ for removed_proto in ${protos}; do
+ proto_files="${proto_files//${removed_proto}/}"
+ done
+ ;;
+ "google/devtools/containeranalysis/v1beta1"*)
+ # this proto is excluded from //google/devtools/containeranalysis/v1beta1:google-cloud-devtools-containeranalysis-v1beta1-java
+ removed_proto="google/devtools/containeranalysis/v1beta1/cvss/cvss.proto"
+ proto_files="${proto_files//${removed_proto}/}"
+ ;;
+esac
"$protoc_path"/protoc "--java_out=${destination_path}/java_proto.jar" ${proto_files}
if [[ "${proto_only}" == "false" ]]; then
# move java_gapic_srcjar/proto/src/main/java (generated resource name helper class)
@@ -172,8 +246,31 @@ fi
unzip_src_files "proto"
# remove empty files in proto-*/src/main/java
remove_empty_files "proto"
+case "${proto_path}" in
+ "google/cloud/aiplatform/v1beta1"*)
+ prefix="google/cloud/aiplatform/v1beta1/schema"
+ protos="${prefix}/annotation_payload.proto ${prefix}/annotation_spec_color.proto ${prefix}/data_item_payload.proto ${prefix}/dataset_metadata.proto ${prefix}/geometry.proto"
+ for added_proto in ${protos}; do
+ proto_files="${proto_files} ${added_proto}"
+ done
+ ;;
+ "google/devtools/containeranalysis/v1beta1"*)
+ proto_files="${proto_files} google/devtools/containeranalysis/v1beta1/cvss/cvss.proto"
+ ;;
+ "google/iam/v1")
+ # these protos are excluded from //google/iam/v1:google-iam-v1-java
+ prefix="google/iam/v1"
+ protos="${prefix}/options.proto ${prefix}/policy.proto"
+ for removed_proto in ${protos}; do
+ proto_files="${proto_files//${removed_proto}/}"
+ done
+ ;;
+esac
# copy proto files to proto-*/src/main/proto
for proto_src in ${proto_files}; do
+ if [[ "${proto_src}" == "google/cloud/common/operation_metadata.proto" ]]; then
+ continue
+ fi
mkdir -p "${destination_path}/proto-${folder_name}/src/main/proto"
rsync -R "${proto_src}" "${destination_path}/proto-${folder_name}/src/main/proto"
done
diff --git a/library_generation/test/generate_library_integration_test.sh b/library_generation/test/generate_library_integration_test.sh
index 910c22415b..c4ea9fde25 100755
--- a/library_generation/test/generate_library_integration_test.sh
+++ b/library_generation/test/generate_library_integration_test.sh
@@ -68,9 +68,18 @@ grep -v '^ *#' < "${proto_path_list}" | while IFS= read -r line; do
gapic_additional_protos=$(get_gapic_additional_protos_from_BUILD "${proto_build_file_path}")
transport=$(get_transport_from_BUILD "${proto_build_file_path}")
rest_numeric_enums=$(get_rest_numeric_enums_from_BUILD "${proto_build_file_path}")
+ gapic_yaml=$(get_gapic_yaml_from_BUILD "${proto_build_file_path}")
+ service_config=$(get_service_config_from_BUILD "${proto_build_file_path}")
+ service_yaml=$(get_service_yaml_from_BUILD "${proto_build_file_path}")
include_samples=$(get_include_samples_from_BUILD "${proto_build_file_path}")
popd # output_folder
- echo "GAPIC options are transport=${transport}, rest_numeric_enums=${rest_numeric_enums}, include_samples=${include_samples}."
+ echo "GAPIC options are
+ transport=${transport},
+ rest_numeric_enums=${rest_numeric_enums},
+ gapic_yaml=${gapic_yaml},
+ service_config=${service_config},
+ service_yaml=${service_yaml},
+ include_samples=${include_samples}."
# generate GAPIC client library
echo "Generating library from ${proto_path}, to ${destination_path}..."
"${library_generation_dir}"/generate_library.sh \
@@ -82,6 +91,9 @@ grep -v '^ *#' < "${proto_path_list}" | while IFS= read -r line; do
--gapic_additional_protos "${gapic_additional_protos}" \
--transport "${transport}" \
--rest_numeric_enums "${rest_numeric_enums}" \
+ --gapic_yaml "${gapic_yaml}" \
+ --service_config "${service_config}" \
+ --service_yaml "${service_yaml}" \
--include_samples "${include_samples}"
echo "Generate library finished."
echo "Checking out googleapis-gen repository..."
diff --git a/library_generation/test/generate_library_unit_tests.sh b/library_generation/test/generate_library_unit_tests.sh
index 8906f3c4cd..8fc94ce94b 100755
--- a/library_generation/test/generate_library_unit_tests.sh
+++ b/library_generation/test/generate_library_unit_tests.sh
@@ -46,7 +46,7 @@ get_gapic_opts_with_rest_test() {
local transport="grpc"
local rest_numeric_enums="true"
local gapic_opts
- gapic_opts="$(get_gapic_opts)"
+ gapic_opts="$(get_gapic_opts "${transport}" "${rest_numeric_enums}" "" "" "")"
assertEquals \
"transport=grpc,rest-numeric-enums,grpc-service-config=${proto_path}/example_grpc_service_config.json,gapic-config=${proto_path}/example_gapic.yaml,api-service-config=${proto_path}/example.yaml" \
"${gapic_opts}"
@@ -57,9 +57,20 @@ get_gapic_opts_without_rest_test() {
local transport="grpc"
local rest_numeric_enums="false"
local gapic_opts
- gapic_opts="$(get_gapic_opts)"
+ gapic_opts="$(get_gapic_opts "${transport}" "${rest_numeric_enums}" "" "" "")"
assertEquals \
- "transport=grpc,grpc-service-config=${proto_path}/example_grpc_service_config.json,gapic-config=${proto_path}/example_gapic.yaml,api-service-config=${proto_path}/example.yaml" \
+ "transport=grpc,,grpc-service-config=${proto_path}/example_grpc_service_config.json,gapic-config=${proto_path}/example_gapic.yaml,api-service-config=${proto_path}/example.yaml" \
+ "$gapic_opts"
+}
+
+get_gapic_opts_with_non_default_test() {
+ local proto_path="${script_dir}/resources/gapic_options"
+ local transport="grpc"
+ local rest_numeric_enums="false"
+ local gapic_opts
+ gapic_opts="$(get_gapic_opts "${transport}" "${rest_numeric_enums}" "${proto_path}/example_gapic.yaml" "${proto_path}/example_grpc_service_config.json" "${proto_path}/example.yaml")"
+ assertEquals \
+ "transport=grpc,,grpc-service-config=${proto_path}/example_grpc_service_config.json,gapic-config=${proto_path}/example_gapic.yaml,api-service-config=${proto_path}/example.yaml" \
"$gapic_opts"
}
@@ -304,6 +315,7 @@ test_list=(
get_protobuf_version_failed_with_invalid_generator_version_test
get_gapic_opts_with_rest_test
get_gapic_opts_without_rest_test
+ get_gapic_opts_with_non_default_test
remove_grpc_version_test
download_generator_success_with_valid_version_test
download_generator_failed_with_invalid_version_test
diff --git a/library_generation/test/resources/proto_path_list.txt b/library_generation/test/resources/proto_path_list.txt
index 3075927c66..2910caa62b 100755
--- a/library_generation/test/resources/proto_path_list.txt
+++ b/library_generation/test/resources/proto_path_list.txt
@@ -6,11 +6,13 @@ google/cloud/apigeeconnect/v1 google-cloud-apigeeconnect-v1-java
google/cloud/asset/v1 google-cloud-asset-v1-java
google/cloud/compute/v1 google-cloud-compute-v1-java
google/cloud/kms/v1 google-cloud-kms-v1-java
+google/cloud/optimization/v1 google-cloud-optimization-v1-java
google/cloud/redis/v1 google-cloud-redis-v1-java
+google/cloud/videointelligence/v1p3beta1 google-cloud-videointelligence-v1p3beta1-java
google/example/library/v1 google-cloud-example-library-v1-java
google/devtools/containeranalysis/v1 google-cloud-devtools-containeranalysis-v1-java
google/firestore/bundle google-cloud-firestore-bundle-v1-java
-# google/iam/v1 google-iam-v1-java
+google/iam/v1 google-iam-v1-java
google/iam/credentials/v1 google-cloud-iam-credentials-v1-java
google/logging/v2 google-cloud-logging-v2-java
google/pubsub/v1 google-cloud-pubsub-v1-java
diff --git a/library_generation/test/test_utilities.sh b/library_generation/test/test_utilities.sh
index 5620ecd49d..578dd8c56d 100755
--- a/library_generation/test/test_utilities.sh
+++ b/library_generation/test/test_utilities.sh
@@ -44,6 +44,46 @@ __get_config_from_BUILD() {
echo "${result}"
}
+__get_gapic_option_from_BUILD() {
+ local build_file=$1
+ local pattern=$2
+ local gapic_option
+ local file_path
+ gapic_option=$(grep "${pattern}" "${build_file}" |\
+ head -1 |\
+ sed 's/.*\"\([^]]*\)\".*/\1/g' |\
+ sed 's/^[[:space:]]*//;s/[[:space:]]*$//'
+ )
+ if [ -z "${gapic_option}" ] || [[ "${gapic_option}" == *"None"* ]]; then
+ echo ""
+ return
+ fi
+
+ if [[ "${gapic_option}" == ":"* ]] || [[ "${gapic_option}" == "*"* ]]; then
+ # if gapic_option starts with : or *, remove the first character.
+ gapic_option="${gapic_option:1}"
+ elif [[ "${gapic_option}" == "//"* ]]; then
+ # gapic option is a bazel target, use the file path and name directly.
+ # remove the leading "//".
+ gapic_option="${gapic_option:2}"
+ # replace ":" with "/"
+ gapic_option="${gapic_option//://}"
+ echo "${gapic_option}"
+ return
+ fi
+
+ file_path="${build_file%/*}"
+ # Make sure gapic option (*.yaml or *.json) exists in proto_path; otherwise
+ # reset gapic option to empty string.
+ if [ -f "${file_path}/${gapic_option}" ]; then
+ gapic_option="${file_path}/${gapic_option}"
+ else
+ echo "WARNING: file ${file_path}/${gapic_option} does not exist, reset gapic option to empty string." >&2
+ gapic_option=""
+ fi
+ echo "${gapic_option}"
+}
+
__get_iam_policy_from_BUILD() {
local build_file=$1
local contains_iam_policy
@@ -190,6 +230,27 @@ get_rest_numeric_enums_from_BUILD() {
echo "${rest_numeric_enums}"
}
+get_gapic_yaml_from_BUILD() {
+ local build_file=$1
+ local gapic_yaml
+ gapic_yaml=$(__get_gapic_option_from_BUILD "${build_file}" "gapic_yaml = ")
+ echo "${gapic_yaml}"
+}
+
+get_service_config_from_BUILD() {
+ local build_file=$1
+ local service_config
+ service_config=$(__get_gapic_option_from_BUILD "${build_file}" "grpc_service_config = ")
+ echo "${service_config}"
+}
+
+get_service_yaml_from_BUILD() {
+ local build_file=$1
+ local service_yaml
+ service_yaml=$(__get_gapic_option_from_BUILD "${build_file}" "service_yaml")
+ echo "${service_yaml}"
+}
+
get_include_samples_from_BUILD() {
local build_file=$1
local include_samples
diff --git a/library_generation/utilities.sh b/library_generation/utilities.sh
index 8897b5c425..cd92506c6e 100755
--- a/library_generation/utilities.sh
+++ b/library_generation/utilities.sh
@@ -56,23 +56,30 @@ unzip_src_files() {
# get gapic options from .yaml and .json files from proto_path.
get_gapic_opts() {
- local gapic_config
- local grpc_service_config
- local api_service_config
- gapic_config=$(find "${proto_path}" -type f -name "*gapic.yaml")
- if [ -z "${gapic_config}" ]; then
- gapic_config=""
- else
- gapic_config="gapic-config=${gapic_config},"
- fi
- grpc_service_config=$(find "${proto_path}" -type f -name "*service_config.json")
- api_service_config=$(find "${proto_path}" -maxdepth 1 -type f \( -name "*.yaml" ! -name "*gapic*.yaml" \))
+ local transport=$1
+ local rest_numeric_enums=$2
+ local gapic_yaml=$3
+ local service_config=$4
+ local service_yaml=$5
if [ "${rest_numeric_enums}" == "true" ]; then
- rest_numeric_enums="rest-numeric-enums,"
+ rest_numeric_enums="rest-numeric-enums"
else
rest_numeric_enums=""
fi
- echo "transport=${transport},${rest_numeric_enums}grpc-service-config=${grpc_service_config},${gapic_config}api-service-config=${api_service_config}"
+ # If any of the gapic options is empty (default value), try to search for
+ # it in proto_path.
+ if [[ "${gapic_yaml}" == "" ]]; then
+ gapic_yaml=$(find "${proto_path}" -type f -name "*gapic.yaml")
+ fi
+
+ if [[ "${service_config}" == "" ]]; then
+ service_config=$(find "${proto_path}" -type f -name "*service_config.json")
+ fi
+
+ if [[ "${service_yaml}" == "" ]]; then
+ service_yaml=$(find "${proto_path}" -maxdepth 1 -type f \( -name "*.yaml" ! -name "*gapic*.yaml" \))
+ fi
+ echo "transport=${transport},${rest_numeric_enums},grpc-service-config=${service_config},gapic-config=${gapic_yaml},api-service-config=${service_yaml}"
}
remove_grpc_version() {
diff --git a/renovate.json b/renovate.json
index b2e66d39f6..51fb38011c 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,64 +1,81 @@
{
"extends": [
- "config:base"
+ "config:recommended"
],
- "ignoreDeps": ["rules_pkg"],
- "regexManagers": [
+ "dependencyDashboard": true,
+ "ignoreDeps": [
+ "rules_pkg"
+ ],
+ "customManagers": [
{
- "fileMatch": ["^gax-java/dependencies\\.properties$"],
- "matchStrings": ["=(?.+\\:.+?):(?.+?)\\n"],
+ "customType": "regex",
+ "fileMatch": [
+ "^gax-java/dependencies\\.properties$"
+ ],
+ "matchStrings": [
+ "=(?.+\\:.+?):(?.+?)\\n"
+ ],
"datasourceTemplate": "maven"
},
{
- "fileMatch": ["^gax-java/dependencies\\.properties$"],
- "matchStrings": ["version\\.com_google_protobuf=(?.+?)\\n"],
+ "customType": "regex",
+ "fileMatch": [
+ "^gax-java/dependencies\\.properties$"
+ ],
+ "matchStrings": [
+ "version\\.com_google_protobuf=(?.+?)\\n"
+ ],
"depNameTemplate": "com.google.protobuf:protobuf-java",
"datasourceTemplate": "maven"
},
{
- "fileMatch": ["^gax-java/dependencies\\.properties$"],
- "matchStrings": ["version\\.google_java_format=(?.+?)\\n"],
+ "customType": "regex",
+ "fileMatch": [
+ "^gax-java/dependencies\\.properties$"
+ ],
+ "matchStrings": [
+ "version\\.google_java_format=(?.+?)\\n"
+ ],
"depNameTemplate": "com.google.googlejavaformat:google-java-format",
"datasourceTemplate": "maven"
},
{
- "fileMatch": ["^gax-java/dependencies\\.properties$"],
- "matchStrings": ["version\\.io_grpc=(?.+?)\\n"],
+ "customType": "regex",
+ "fileMatch": [
+ "^gax-java/dependencies\\.properties$"
+ ],
+ "matchStrings": [
+ "version\\.io_grpc=(?.+?)\\n"
+ ],
"depNameTemplate": "io.grpc:grpc-core",
"datasourceTemplate": "maven"
- },
- {
- "fileMatch": ["^\\.kokoro/presubmit/.*\\.sh"],
- "matchStrings": ["SHOWCASE_VERSION=(?.+?)\\n"],
- "datasourceTemplate": "go"
- },
- {
- "fileMatch": ["^showcase/gapic-showcase/pom\\.xml$"],
- "matchStrings": ["(?.+?)\\n"],
- "datasourceTemplate": "go"
}
],
"packageRules": [
- {
- "matchUpdateTypes": ["major"],
- "matchPackagePatterns": ["*"],
+ {
+ "matchUpdateTypes": [
+ "major"
+ ],
+ "matchPackagePatterns": [
+ "*"
+ ],
"enabled": false
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^com.google.guava:"
],
- "versionScheme": "docker"
+ "versioning": "docker"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"*"
],
"semanticCommitType": "deps",
"semanticCommitScope": null
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^org.apache.maven",
"^org.jacoco:",
"^org.codehaus.mojo:",
@@ -70,7 +87,7 @@
"semanticCommitScope": "deps"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^{{metadata['repo']['distribution_name']}}",
"^com.google.cloud:libraries-bom",
"^com.google.cloud.samples:shared-configuration"
@@ -79,7 +96,7 @@
"semanticCommitScope": "deps"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^junit:junit",
"^com.google.truth:truth",
"^org.mockito:mockito-core",
@@ -90,55 +107,55 @@
"semanticCommitScope": "deps"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^com.google.cloud:google-cloud-"
],
"ignoreUnstable": false
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^com.fasterxml.jackson.core"
],
"groupName": "jackson dependencies"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^com.google.protobuf"
],
"groupName": "Protobuf dependencies"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^io.grpc"
],
"groupName": "gRPC dependencies"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^com.google.auth"
],
"groupName": "Google Auth Library dependencies"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^com.google.api"
],
"groupName": "Google API dependencies"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^com.google.http-client"
],
"groupName": "Google HTTP Client dependencies"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^io.opencensus"
],
"groupName": "OpenCensus dependencies"
},
{
- "packagePatterns": [
+ "matchPackagePatterns": [
"^io.netty"
],
"groupName": "Netty dependencies"
diff --git a/rules_java_gapic/resources/gradle/gradle/wrapper/gradle-wrapper.properties b/rules_java_gapic/resources/gradle/gradle/wrapper/gradle-wrapper.properties
index 774fae8767..068cdb2dc2 100644
--- a/rules_java_gapic/resources/gradle/gradle/wrapper/gradle-wrapper.properties
+++ b/rules_java_gapic/resources/gradle/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/showcase/gapic-showcase/pom.xml b/showcase/gapic-showcase/pom.xml
index 5eab85a38d..543229da11 100644
--- a/showcase/gapic-showcase/pom.xml
+++ b/showcase/gapic-showcase/pom.xml
@@ -27,7 +27,7 @@
org.jacoco
jacoco-maven-plugin
- 0.8.8
+ 0.8.11
report
@@ -139,7 +139,7 @@
com.google.truth
truth
- 1.1.3
+ 1.1.5
test
diff --git a/showcase/grpc-gapic-showcase-v1beta1/pom.xml b/showcase/grpc-gapic-showcase-v1beta1/pom.xml
index 50b89a1e81..9fce31015f 100644
--- a/showcase/grpc-gapic-showcase-v1beta1/pom.xml
+++ b/showcase/grpc-gapic-showcase-v1beta1/pom.xml
@@ -47,4 +47,19 @@
guava
+
+
+
+
+ showcase-sonar-analysis
+
+
+ enableShowcaseTestCoverage
+
+
+
+ true
+
+
+
diff --git a/showcase/pom.xml b/showcase/pom.xml
index f0263f388f..cc988ea2ae 100644
--- a/showcase/pom.xml
+++ b/showcase/pom.xml
@@ -15,7 +15,7 @@
com.google.cloud
google-cloud-shared-config
- 1.5.8
+ 1.6.0
@@ -34,7 +34,7 @@
com.google.cloud
google-cloud-shared-dependencies
- 3.17.0
+ 3.18.0
pom
import
@@ -108,7 +108,7 @@
org.apache.maven.plugins
maven-surefire-plugin
- 3.0.0-M8
+ 3.1.2
sponge_log
${skipUnitTests}
diff --git a/showcase/proto-gapic-showcase-v1beta1/pom.xml b/showcase/proto-gapic-showcase-v1beta1/pom.xml
index e4d74f6a84..cef41f54ff 100644
--- a/showcase/proto-gapic-showcase-v1beta1/pom.xml
+++ b/showcase/proto-gapic-showcase-v1beta1/pom.xml
@@ -39,4 +39,19 @@
guava
+
+
+
+
+ showcase-sonar-analysis
+
+
+ enableShowcaseTestCoverage
+
+
+
+ true
+
+
+
diff --git a/showcase/scripts/generate_showcase.sh b/showcase/scripts/generate_showcase.sh
index 26ffdd7a45..69530fe354 100755
--- a/showcase/scripts/generate_showcase.sh
+++ b/showcase/scripts/generate_showcase.sh
@@ -49,6 +49,9 @@ ggj_version=$(get_version_from_versions_txt ../../versions.txt "gapic-generator-
gapic_additional_protos="google/iam/v1/iam_policy.proto google/cloud/location/locations.proto"
rest_numeric_enums="false"
transport="grpc+rest"
+gapic_yaml=""
+service_config="schema/google/showcase/v1beta1/showcase_grpc_service_config.json"
+service_yaml="schema/google/showcase/v1beta1/showcase_v1beta1.yaml"
include_samples="false"
rm -rdf output/showcase-output
mkdir output/showcase-output
@@ -59,6 +62,9 @@ bash "${SCRIPT_DIR}/../../library_generation/generate_library.sh" \
--gapic_generator_version "${ggj_version}" \
--gapic_additional_protos "${gapic_additional_protos}" \
--rest_numeric_enums "${rest_numeric_enums}" \
+ --gapic_yaml "${gapic_yaml}" \
+ --service_config "${service_config}" \
+ --service_yaml "${service_yaml}" \
--include_samples "${include_samples}" \
--transport "${transport}"
diff --git a/versions.txt b/versions.txt
index 84ab8791c7..12b8ad1710 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,19 +1,19 @@
# Format:
# module:released-version:current-version
-gapic-generator-java:2.27.0:2.27.0
-api-common:2.18.0:2.18.0
-gax:2.35.0:2.35.0
-gax-grpc:2.35.0:2.35.0
-gax-httpjson:0.120.0:0.120.0
-proto-google-common-protos:2.26.0:2.26.0
-grpc-google-common-protos:2.26.0:2.26.0
-proto-google-iam-v1:1.21.0:1.21.0
-grpc-google-iam-v1:1.21.0:1.21.0
-proto-google-iam-v2beta:1.21.0:1.21.0
-grpc-google-iam-v2beta:1.21.0:1.21.0
-google-iam-policy:1.21.0:1.21.0
-proto-google-iam-v2:1.21.0:1.21.0
-grpc-google-iam-v2:1.21.0:1.21.0
-google-cloud-core:2.25.0:2.25.0
-google-cloud-shared-dependencies:3.17.0:3.17.0
+gapic-generator-java:2.28.0:2.28.0
+api-common:2.19.0:2.19.0
+gax:2.36.0:2.36.0
+gax-grpc:2.36.0:2.36.0
+gax-httpjson:0.121.0:0.121.0
+proto-google-common-protos:2.27.0:2.27.0
+grpc-google-common-protos:2.27.0:2.27.0
+proto-google-iam-v1:1.22.0:1.22.0
+grpc-google-iam-v1:1.22.0:1.22.0
+proto-google-iam-v2beta:1.22.0:1.22.0
+grpc-google-iam-v2beta:1.22.0:1.22.0
+google-iam-policy:1.22.0:1.22.0
+proto-google-iam-v2:1.22.0:1.22.0
+grpc-google-iam-v2:1.22.0:1.22.0
+google-cloud-core:2.26.0:2.26.0
+google-cloud-shared-dependencies:3.18.0:3.18.0