Skip to content

Commit d589306

Browse files
authored
fix: add per-service api_version to gapic_metadata (#3984)
Populates the `api_version` field on a per-`service` basis to the generated `gapic_metadata.json` using the value from the `service`-level annotation `google.api.api_version` already parsed for use in the `X-Goog-Api-Version`/`$apiVersion` system parameter (as of #2671). Updates the `googleapis.commit` used in internal dependency artifact generation to capture change to `gapic_metadata.proto`. Chose the most recent as of writing this. This also has the effect of updating some unit test goldens and unit test fixture dependencies that are based on protos at that commit. The Showcase `echo.proto` already has the `google.api.api_version` set on `service Echo`, so the `java-showcase` package is appropriately updated to account for inclusion of `apiVersion` in the `gapic_metadata.json` output. It is not in use by any API yet. It's presence in `gapic_metadata.json` will allow parsers to correlate `service` client to API version. Internal bug http://b/452365074.
1 parent 7b2975d commit d589306

File tree

5 files changed

+81
-29
lines changed

5 files changed

+81
-29
lines changed

gapic-generator-java/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<clirr.skip>true</clirr.skip>
1515
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
1616
<!-- Should be in sync with repositories.bzl -->
17-
<googleapis.commit>44d6bef0ca6db8bba3fb324c8186e694bcc4829c</googleapis.commit>
17+
<googleapis.commit>9fcfbea0aa5b50fa22e190faceb073d74504172b</googleapis.commit>
1818
<maven.compiler.source>1.8</maven.compiler.source>
1919
<maven.compiler.target>1.8</maven.compiler.target>
2020
</properties>

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,12 +1898,15 @@ private static void updateGapicMetadata(
18981898
serviceClientProtoBuilder.putRpcs(rpcName, methodList);
18991899
}
19001900

1901-
metadataBuilder =
1902-
metadataBuilder.putServices(
1903-
service.name(),
1904-
GapicMetadata.ServiceForTransport.newBuilder()
1905-
.putClients("grpc", serviceClientProtoBuilder.build())
1906-
.build());
1901+
GapicMetadata.ServiceForTransport.Builder grpcServiceClient =
1902+
GapicMetadata.ServiceForTransport.newBuilder()
1903+
.putClients("grpc", serviceClientProtoBuilder.build());
1904+
1905+
if (service.hasApiVersion()) {
1906+
grpcServiceClient.setApiVersion(service.apiVersion());
1907+
}
1908+
1909+
metadataBuilder = metadataBuilder.putServices(service.name(), grpcServiceClient.build());
19071910
context.updateGapicMetadata(metadataBuilder.build());
19081911
}
19091912
}

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/SubscriberClientTest.golden

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.google.api.gax.rpc.StatusCode;
1717
import com.google.common.collect.Lists;
1818
import com.google.protobuf.AbstractMessage;
1919
import com.google.protobuf.Empty;
20+
import com.google.protobuf.FieldMask;
2021
import google.cloud.ProjectName;
2122
import io.grpc.StatusRuntimeException;
2223
import java.io.IOException;
@@ -79,6 +80,8 @@ public class SubscriberClientTest {
7980
.setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString())
8081
.setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString())
8182
.setPushConfig(PushConfig.newBuilder().build())
83+
.setBigqueryConfig(BigQueryConfig.newBuilder().build())
84+
.setCloudStorageConfig(CloudStorageConfig.newBuilder().build())
8285
.setAckDeadlineSeconds(2135351438)
8386
.setRetainAckedMessages(true)
8487
.putAllLabels(new HashMap<String, String>())
@@ -89,6 +92,10 @@ public class SubscriberClientTest {
8992
.setRetryPolicy(RetryPolicy.newBuilder().build())
9093
.setDetached(true)
9194
.setEnableExactlyOnceDelivery(true)
95+
.setAnalyticsHubSubscriptionInfo(
96+
Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build())
97+
.addAllMessageTransforms(new ArrayList<MessageTransform>())
98+
.putAllTags(new HashMap<String, String>())
9299
.build();
93100
mockSubscriber.addResponse(expectedResponse);
94101

@@ -139,6 +146,8 @@ public class SubscriberClientTest {
139146
.setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString())
140147
.setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString())
141148
.setPushConfig(PushConfig.newBuilder().build())
149+
.setBigqueryConfig(BigQueryConfig.newBuilder().build())
150+
.setCloudStorageConfig(CloudStorageConfig.newBuilder().build())
142151
.setAckDeadlineSeconds(2135351438)
143152
.setRetainAckedMessages(true)
144153
.putAllLabels(new HashMap<String, String>())
@@ -149,6 +158,10 @@ public class SubscriberClientTest {
149158
.setRetryPolicy(RetryPolicy.newBuilder().build())
150159
.setDetached(true)
151160
.setEnableExactlyOnceDelivery(true)
161+
.setAnalyticsHubSubscriptionInfo(
162+
Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build())
163+
.addAllMessageTransforms(new ArrayList<MessageTransform>())
164+
.putAllTags(new HashMap<String, String>())
152165
.build();
153166
mockSubscriber.addResponse(expectedResponse);
154167

@@ -199,6 +212,8 @@ public class SubscriberClientTest {
199212
.setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString())
200213
.setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString())
201214
.setPushConfig(PushConfig.newBuilder().build())
215+
.setBigqueryConfig(BigQueryConfig.newBuilder().build())
216+
.setCloudStorageConfig(CloudStorageConfig.newBuilder().build())
202217
.setAckDeadlineSeconds(2135351438)
203218
.setRetainAckedMessages(true)
204219
.putAllLabels(new HashMap<String, String>())
@@ -209,6 +224,10 @@ public class SubscriberClientTest {
209224
.setRetryPolicy(RetryPolicy.newBuilder().build())
210225
.setDetached(true)
211226
.setEnableExactlyOnceDelivery(true)
227+
.setAnalyticsHubSubscriptionInfo(
228+
Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build())
229+
.addAllMessageTransforms(new ArrayList<MessageTransform>())
230+
.putAllTags(new HashMap<String, String>())
212231
.build();
213232
mockSubscriber.addResponse(expectedResponse);
214233

@@ -259,6 +278,8 @@ public class SubscriberClientTest {
259278
.setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString())
260279
.setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString())
261280
.setPushConfig(PushConfig.newBuilder().build())
281+
.setBigqueryConfig(BigQueryConfig.newBuilder().build())
282+
.setCloudStorageConfig(CloudStorageConfig.newBuilder().build())
262283
.setAckDeadlineSeconds(2135351438)
263284
.setRetainAckedMessages(true)
264285
.putAllLabels(new HashMap<String, String>())
@@ -269,6 +290,10 @@ public class SubscriberClientTest {
269290
.setRetryPolicy(RetryPolicy.newBuilder().build())
270291
.setDetached(true)
271292
.setEnableExactlyOnceDelivery(true)
293+
.setAnalyticsHubSubscriptionInfo(
294+
Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build())
295+
.addAllMessageTransforms(new ArrayList<MessageTransform>())
296+
.putAllTags(new HashMap<String, String>())
272297
.build();
273298
mockSubscriber.addResponse(expectedResponse);
274299

@@ -319,6 +344,8 @@ public class SubscriberClientTest {
319344
.setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString())
320345
.setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString())
321346
.setPushConfig(PushConfig.newBuilder().build())
347+
.setBigqueryConfig(BigQueryConfig.newBuilder().build())
348+
.setCloudStorageConfig(CloudStorageConfig.newBuilder().build())
322349
.setAckDeadlineSeconds(2135351438)
323350
.setRetainAckedMessages(true)
324351
.putAllLabels(new HashMap<String, String>())
@@ -329,6 +356,10 @@ public class SubscriberClientTest {
329356
.setRetryPolicy(RetryPolicy.newBuilder().build())
330357
.setDetached(true)
331358
.setEnableExactlyOnceDelivery(true)
359+
.setAnalyticsHubSubscriptionInfo(
360+
Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build())
361+
.addAllMessageTransforms(new ArrayList<MessageTransform>())
362+
.putAllTags(new HashMap<String, String>())
332363
.build();
333364
mockSubscriber.addResponse(expectedResponse);
334365

@@ -369,6 +400,8 @@ public class SubscriberClientTest {
369400
.setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString())
370401
.setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString())
371402
.setPushConfig(PushConfig.newBuilder().build())
403+
.setBigqueryConfig(BigQueryConfig.newBuilder().build())
404+
.setCloudStorageConfig(CloudStorageConfig.newBuilder().build())
372405
.setAckDeadlineSeconds(2135351438)
373406
.setRetainAckedMessages(true)
374407
.putAllLabels(new HashMap<String, String>())
@@ -379,6 +412,10 @@ public class SubscriberClientTest {
379412
.setRetryPolicy(RetryPolicy.newBuilder().build())
380413
.setDetached(true)
381414
.setEnableExactlyOnceDelivery(true)
415+
.setAnalyticsHubSubscriptionInfo(
416+
Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build())
417+
.addAllMessageTransforms(new ArrayList<MessageTransform>())
418+
.putAllTags(new HashMap<String, String>())
382419
.build();
383420
mockSubscriber.addResponse(expectedResponse);
384421

@@ -419,6 +456,8 @@ public class SubscriberClientTest {
419456
.setName(SubscriptionName.of("[PROJECT]", "[SUBSCRIPTION]").toString())
420457
.setTopic(TopicName.ofProjectTopicName("[PROJECT]", "[TOPIC]").toString())
421458
.setPushConfig(PushConfig.newBuilder().build())
459+
.setBigqueryConfig(BigQueryConfig.newBuilder().build())
460+
.setCloudStorageConfig(CloudStorageConfig.newBuilder().build())
422461
.setAckDeadlineSeconds(2135351438)
423462
.setRetainAckedMessages(true)
424463
.putAllLabels(new HashMap<String, String>())
@@ -429,23 +468,25 @@ public class SubscriberClientTest {
429468
.setRetryPolicy(RetryPolicy.newBuilder().build())
430469
.setDetached(true)
431470
.setEnableExactlyOnceDelivery(true)
471+
.setAnalyticsHubSubscriptionInfo(
472+
Subscription.AnalyticsHubSubscriptionInfo.newBuilder().build())
473+
.addAllMessageTransforms(new ArrayList<MessageTransform>())
474+
.putAllTags(new HashMap<String, String>())
432475
.build();
433476
mockSubscriber.addResponse(expectedResponse);
434477

435-
UpdateSubscriptionRequest request =
436-
UpdateSubscriptionRequest.newBuilder()
437-
.setSubscription(Subscription.newBuilder().build())
438-
.build();
478+
Subscription subscription = Subscription.newBuilder().build();
479+
FieldMask updateMask = FieldMask.newBuilder().build();
439480

440-
Subscription actualResponse = client.updateSubscription(request);
481+
Subscription actualResponse = client.updateSubscription(subscription, updateMask);
441482
Assert.assertEquals(expectedResponse, actualResponse);
442483

443484
List<AbstractMessage> actualRequests = mockSubscriber.getRequests();
444485
Assert.assertEquals(1, actualRequests.size());
445486
UpdateSubscriptionRequest actualRequest = ((UpdateSubscriptionRequest) actualRequests.get(0));
446487

447-
Assert.assertEquals(request.getSubscription(), actualRequest.getSubscription());
448-
Assert.assertEquals(request.getUpdateMask(), actualRequest.getUpdateMask());
488+
Assert.assertEquals(subscription, actualRequest.getSubscription());
489+
Assert.assertEquals(updateMask, actualRequest.getUpdateMask());
449490
Assert.assertTrue(
450491
channelProvider.isHeaderSent(
451492
ApiClientHeaderProvider.getDefaultApiClientHeaderKey(),
@@ -458,11 +499,9 @@ public class SubscriberClientTest {
458499
mockSubscriber.addException(exception);
459500

460501
try {
461-
UpdateSubscriptionRequest request =
462-
UpdateSubscriptionRequest.newBuilder()
463-
.setSubscription(Subscription.newBuilder().build())
464-
.build();
465-
client.updateSubscription(request);
502+
Subscription subscription = Subscription.newBuilder().build();
503+
FieldMask updateMask = FieldMask.newBuilder().build();
504+
client.updateSubscription(subscription, updateMask);
466505
Assert.fail("No exception raised");
467506
} catch (InvalidArgumentException e) {
468507
// Expected exception.
@@ -946,7 +985,7 @@ public class SubscriberClientTest {
946985
StreamingPullResponse expectedResponse =
947986
StreamingPullResponse.newBuilder()
948987
.addAllReceivedMessages(new ArrayList<ReceivedMessage>())
949-
.setAcknowlegeConfirmation(
988+
.setAcknowledgeConfirmation(
950989
StreamingPullResponse.AcknowledgeConfirmation.newBuilder().build())
951990
.setModifyAckDeadlineConfirmation(
952991
StreamingPullResponse.ModifyAckDeadlineConfirmation.newBuilder().build())
@@ -964,6 +1003,7 @@ public class SubscriberClientTest {
9641003
.setClientId("clientId908408390")
9651004
.setMaxOutstandingMessages(-1315266996)
9661005
.setMaxOutstandingBytes(-2103098517)
1006+
.setProtocolVersion(-1161610703)
9671007
.build();
9681008

9691009
MockStreamObserver<StreamingPullResponse> responseObserver = new MockStreamObserver<>();
@@ -995,6 +1035,7 @@ public class SubscriberClientTest {
9951035
.setClientId("clientId908408390")
9961036
.setMaxOutstandingMessages(-1315266996)
9971037
.setMaxOutstandingBytes(-2103098517)
1038+
.setProtocolVersion(-1161610703)
9981039
.build();
9991040

10001041
MockStreamObserver<StreamingPullResponse> responseObserver = new MockStreamObserver<>();
@@ -1440,18 +1481,18 @@ public class SubscriberClientTest {
14401481
.build();
14411482
mockSubscriber.addResponse(expectedResponse);
14421483

1443-
UpdateSnapshotRequest request =
1444-
UpdateSnapshotRequest.newBuilder().setSnapshot(Snapshot.newBuilder().build()).build();
1484+
Snapshot snapshot = Snapshot.newBuilder().build();
1485+
FieldMask updateMask = FieldMask.newBuilder().build();
14451486

1446-
Snapshot actualResponse = client.updateSnapshot(request);
1487+
Snapshot actualResponse = client.updateSnapshot(snapshot, updateMask);
14471488
Assert.assertEquals(expectedResponse, actualResponse);
14481489

14491490
List<AbstractMessage> actualRequests = mockSubscriber.getRequests();
14501491
Assert.assertEquals(1, actualRequests.size());
14511492
UpdateSnapshotRequest actualRequest = ((UpdateSnapshotRequest) actualRequests.get(0));
14521493

1453-
Assert.assertEquals(request.getSnapshot(), actualRequest.getSnapshot());
1454-
Assert.assertEquals(request.getUpdateMask(), actualRequest.getUpdateMask());
1494+
Assert.assertEquals(snapshot, actualRequest.getSnapshot());
1495+
Assert.assertEquals(updateMask, actualRequest.getUpdateMask());
14551496
Assert.assertTrue(
14561497
channelProvider.isHeaderSent(
14571498
ApiClientHeaderProvider.getDefaultApiClientHeaderKey(),
@@ -1464,9 +1505,9 @@ public class SubscriberClientTest {
14641505
mockSubscriber.addException(exception);
14651506

14661507
try {
1467-
UpdateSnapshotRequest request =
1468-
UpdateSnapshotRequest.newBuilder().setSnapshot(Snapshot.newBuilder().build()).build();
1469-
client.updateSnapshot(request);
1508+
Snapshot snapshot = Snapshot.newBuilder().build();
1509+
FieldMask updateMask = FieldMask.newBuilder().build();
1510+
client.updateSnapshot(snapshot, updateMask);
14701511
Assert.fail("No exception raised");
14711512
} catch (InvalidArgumentException e) {
14721513
// Expected exception.

gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/resourcename/ResourceNameHelperClassComposerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.google.logging.v2.LoggingProto;
3434
import com.google.protobuf.Descriptors.FileDescriptor;
3535
import com.google.protobuf.Descriptors.ServiceDescriptor;
36+
import com.google.protobuf.EmptyProto;
3637
import com.google.showcase.v1beta1.EchoOuterClass;
3738
import com.google.showcase.v1beta1.TestingOuterClass;
3839
import com.google.test.collisions.CollisionsOuterClass;
@@ -143,6 +144,12 @@ void generateResourceNameClass_loggingOnePatternMultipleVariables() {
143144
FileDescriptor commonResourcesFileDescriptor = CommonResources.getDescriptor();
144145
resourceNames.putAll(Parser.parseResourceNames(commonResourcesFileDescriptor));
145146

147+
// Additional dependency found in LoggingService.DeleteLink LRO
148+
// (google.longrunning.operation_info).response_type. Necessary for
149+
// complete parsing of the descriptors.
150+
FileDescriptor emptyFileDescriptor = EmptyProto.getDescriptor();
151+
messageTypes.putAll(Parser.parseMessages(emptyFileDescriptor));
152+
146153
Set<ResourceName> outputResourceNames = new HashSet<>();
147154
Parser.parseService(
148155
serviceFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames);

java-showcase/gapic-showcase/src/main/java/com/google/showcase/v1beta1/gapic_metadata.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,8 @@
114114
}
115115
}
116116
}
117-
}
117+
},
118+
"apiVersion": "v1_20240408"
118119
},
119120
"Identity": {
120121
"clients": {

0 commit comments

Comments
 (0)