Skip to content

Commit 8822f3b

Browse files
authored
feat: Parse Host Service Name (#2300)
* refactor: Add transportchannelprovider's endpoint to EndpointContext * chore: Add Endpoint tests for ClientContext * chore: Resolve PR comments * feat: Add HostServiceName to StubSettings * chore: Add comments for hostservicename * chore: Fix setEndpoint logic * chore: Add InternalApi annotation to setDefaultHost in StubSettings * fix: Expose HostServiceName in ClientContext * chore: Add comments for hostservicename * chore: Set hostServiceName to package private scope * chore: Update integration tests * chore: Resolve PR comments * chore: Do not generate getServiceName if hostServiceName is empty * chore: Add tests for parsing Host Service Name
1 parent f8969d2 commit 8822f3b

File tree

27 files changed

+211
-1
lines changed

27 files changed

+211
-1
lines changed

gapic-generator-java/src/main/java/com/google/api/generator/gapic/composer/comment/SettingsCommentComposer.java

+3
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ public class SettingsCommentComposer {
5757

5858
public static final CommentStatement DEFAULT_EXECUTOR_PROVIDER_BUILDER_METHOD_COMMENT =
5959
toSimpleComment("Returns a builder for the default ExecutorProvider for this service.");
60+
61+
public static final CommentStatement DEFAULT_SERVICE_NAME_METHOD_COMMENT =
62+
toSimpleComment("Returns the default service name.");
6063
public static final CommentStatement DEFAULT_SERVICE_ENDPOINT_METHOD_COMMENT =
6164
toSimpleComment("Returns the default service endpoint.");
6265
public static final CommentStatement DEFAULT_SERVICE_MTLS_ENDPOINT_METHOD_COMMENT =

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

+20-1
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
import com.google.api.generator.gapic.model.Service;
9898
import com.google.api.generator.gapic.utils.JavaStyle;
9999
import com.google.common.base.Preconditions;
100+
import com.google.common.base.Strings;
100101
import com.google.common.collect.ImmutableList;
101102
import com.google.common.collect.ImmutableMap;
102103
import com.google.common.collect.ImmutableSet;
@@ -1137,9 +1138,27 @@ private MethodDefinition createCreateStubMethod(Service service, TypeStore typeS
11371138
private List<MethodDefinition> createDefaultHelperAndGetterMethods(
11381139
Service service, TypeStore typeStore) {
11391140
List<MethodDefinition> javaMethods = new ArrayList<>();
1141+
TypeNode returnType;
1142+
1143+
// Create the getServiceName method.
1144+
if (!Strings.isNullOrEmpty(service.hostServiceName())) {
1145+
returnType = TypeNode.STRING;
1146+
javaMethods.add(
1147+
MethodDefinition.builder()
1148+
.setHeaderCommentStatements(
1149+
SettingsCommentComposer.DEFAULT_SERVICE_NAME_METHOD_COMMENT)
1150+
.setIsOverride(true)
1151+
.setScope(ScopeNode.PUBLIC)
1152+
.setIsStatic(false)
1153+
.setReturnType(returnType)
1154+
.setName("getServiceName")
1155+
.setReturnExpr(
1156+
ValueExpr.withValue(StringObjectValue.withValue(service.hostServiceName())))
1157+
.build());
1158+
}
11401159

11411160
// Create the defaultExecutorProviderBuilder method.
1142-
TypeNode returnType =
1161+
returnType =
11431162
TypeNode.withReference(
11441163
ConcreteReference.withClazz(InstantiatingExecutorProvider.Builder.class));
11451164
javaMethods.add(

gapic-generator-java/src/main/java/com/google/api/generator/gapic/model/Service.java

+17
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@ public boolean hasDescription() {
5252
return !Strings.isNullOrEmpty(description());
5353
}
5454

55+
public String hostServiceName() {
56+
// Host Service Name is guaranteed to exist and be non-null and non-empty
57+
// Parser will fail if the default host is not supplied
58+
return parseHostServiceName(defaultHost());
59+
}
60+
5561
public String apiShortName() {
5662
if (!Strings.isNullOrEmpty(defaultHost())) {
5763
return parseApiShortName(defaultHost());
@@ -184,6 +190,17 @@ private static String parseApiVersion(String protoPackage) {
184190
return apiVersion;
185191
}
186192

193+
// Parse the service name from the default host configured in the protos
194+
// or service yaml file. For Google Cloud Services, the default host value
195+
// is expected to contain `.googleapis.com`. Exceptions may exist (i.e. localhost),
196+
// in which case we will return an empty string.
197+
private static String parseHostServiceName(String defaultHost) {
198+
if (defaultHost.contains(".googleapis.com")) {
199+
return Iterables.getFirst(Splitter.on(".").split(defaultHost), defaultHost);
200+
}
201+
return "";
202+
}
203+
187204
// Parse defaultHost for apiShortName for the RegionTag. Need to account for regional default
188205
// endpoints like
189206
// "us-east1-pubsub.googleapis.com".

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

+6
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,12 @@ public class LoggingServiceV2StubSettings extends StubSettings<LoggingServiceV2S
422422
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
423423
}
424424

425+
/** Returns the default service name. */
426+
@Override
427+
public String getServiceName() {
428+
return "logging";
429+
}
430+
425431
/** Returns a builder for the default ExecutorProvider for this service. */
426432
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
427433
return InstantiatingExecutorProvider.newBuilder();

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

+6
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,12 @@ public class PublisherStubSettings extends StubSettings<PublisherStubSettings> {
431431
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
432432
}
433433

434+
/** Returns the default service name. */
435+
@Override
436+
public String getServiceName() {
437+
return "pubsub";
438+
}
439+
434440
/** Returns a builder for the default ExecutorProvider for this service. */
435441
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
436442
return InstantiatingExecutorProvider.newBuilder();

gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/ServiceTest.java

+13
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,17 @@ public void hasAnyEnabledMethodsForTransport_shouldThrowExceptionForGRPCRESTTran
177177
Service testService = testServiceBuilder.build();
178178
testService.hasAnyEnabledMethodsForTransport(Transport.GRPC_REST);
179179
}
180+
181+
@Test
182+
public void hostServiceName_googleApisDefaultHost() {
183+
Service service = testServiceBuilder.setDefaultHost("test.googleapis.com").build();
184+
assertThat(service.hostServiceName()).isEqualTo("test");
185+
}
186+
187+
@Test
188+
public void hostServiceName_nonGoogleApisDefaultHost() {
189+
// Default Host is localhost:7469
190+
Service service = testServiceBuilder.build();
191+
assertThat(service.hostServiceName()).isEqualTo("");
192+
}
180193
}

gax-java/gax/src/main/java/com/google/api/gax/rpc/ClientContext.java

+9
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@ public abstract class ClientContext {
100100
@Nonnull
101101
public abstract Duration getStreamWatchdogCheckInterval();
102102

103+
// Package-Private scope for internal use only. Shared between StubSettings and ClientContext
104+
@Nullable
105+
abstract String getServiceName();
106+
103107
@Nullable
104108
public abstract String getEndpoint();
105109

@@ -202,6 +206,7 @@ public static ClientContext create(StubSettings settings) throws IOException {
202206
}
203207
EndpointContext endpointContext =
204208
EndpointContext.newBuilder()
209+
.setServiceName(settings.getServiceName())
205210
.setClientSettingsEndpoint(settings.getEndpoint())
206211
.setTransportChannelProviderEndpoint(
207212
settings.getTransportChannelProvider().getEndpoint())
@@ -258,6 +263,7 @@ public static ClientContext create(StubSettings settings) throws IOException {
258263
.setInternalHeaders(ImmutableMap.copyOf(settings.getInternalHeaderProvider().getHeaders()))
259264
.setClock(clock)
260265
.setDefaultCallContext(defaultCallContext)
266+
.setServiceName(settings.getServiceName())
261267
.setEndpoint(settings.getEndpoint())
262268
.setQuotaProjectId(settings.getQuotaProjectId())
263269
.setStreamWatchdog(watchdog)
@@ -323,6 +329,9 @@ public abstract static class Builder {
323329

324330
public abstract Builder setDefaultCallContext(ApiCallContext defaultCallContext);
325331

332+
// Package-Private scope for internal use only. Shared between StubSettings and ClientContext
333+
abstract Builder setServiceName(String serviceName);
334+
326335
public abstract Builder setEndpoint(String endpoint);
327336

328337
public abstract Builder setQuotaProjectId(String QuotaProjectId);

gax-java/gax/src/main/java/com/google/api/gax/rpc/EndpointContext.java

+15
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@
4040
@InternalApi
4141
@AutoValue
4242
public abstract class EndpointContext {
43+
/**
44+
* ServiceName is host URI for Google Cloud Services. It follows the format of
45+
* `{ServiceName}.googleapis.com`. For example, speech.googleapis.com would have a ServiceName of
46+
* speech and cloudasset.googleapis.com would have a ServiceName of cloudasset.
47+
*/
48+
@Nullable
49+
public abstract String serviceName();
50+
4351
/**
4452
* ClientSettingsEndpoint is the endpoint value set via the ClientSettings/StubSettings classes.
4553
*/
@@ -117,6 +125,13 @@ public String getResolvedEndpoint() {
117125

118126
@AutoValue.Builder
119127
public abstract static class Builder {
128+
/**
129+
* ServiceName is host URI for Google Cloud Services. It follows the format of
130+
* `{ServiceName}.googleapis.com`. For example, speech.googleapis.com would have a ServiceName
131+
* of speech and cloudasset.googleapis.com would have a ServiceName of cloudasset.
132+
*/
133+
public abstract Builder setServiceName(String serviceName);
134+
120135
/**
121136
* ClientSettingsEndpoint is the endpoint value set via the ClientSettings/StubSettings classes.
122137
*/

gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java

+14
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.google.api.core.ApiClock;
3333
import com.google.api.core.ApiFunction;
3434
import com.google.api.core.BetaApi;
35+
import com.google.api.core.InternalApi;
3536
import com.google.api.core.NanoClock;
3637
import com.google.api.gax.core.CredentialsProvider;
3738
import com.google.api.gax.core.ExecutorProvider;
@@ -70,6 +71,7 @@ public abstract class StubSettings<SettingsT extends StubSettings<SettingsT>> {
7071
private final HeaderProvider internalHeaderProvider;
7172
private final TransportChannelProvider transportChannelProvider;
7273
private final ApiClock clock;
74+
private final String serviceName;
7375
private final String endpoint;
7476
private final String mtlsEndpoint;
7577
private final String quotaProjectId;
@@ -96,6 +98,7 @@ protected StubSettings(Builder builder) {
9698
this.headerProvider = builder.headerProvider;
9799
this.internalHeaderProvider = builder.internalHeaderProvider;
98100
this.clock = builder.clock;
101+
this.serviceName = builder.serviceName;
99102
this.endpoint = builder.endpoint;
100103
this.mtlsEndpoint = builder.mtlsEndpoint;
101104
this.switchToMtlsEndpointAllowed = builder.switchToMtlsEndpointAllowed;
@@ -137,6 +140,13 @@ public final ApiClock getClock() {
137140
return clock;
138141
}
139142

143+
// Intended for Internal Use and Overriden by generated ServiceStubSettings classes.
144+
// Meant to be shared between StubSettings and ClientContext.
145+
@InternalApi
146+
public String getServiceName() {
147+
return "";
148+
}
149+
140150
public final String getEndpoint() {
141151
return endpoint;
142152
}
@@ -211,6 +221,7 @@ public abstract static class Builder<
211221
private HeaderProvider internalHeaderProvider;
212222
private TransportChannelProvider transportChannelProvider;
213223
private ApiClock clock;
224+
private String serviceName;
214225
private String endpoint;
215226
private String mtlsEndpoint;
216227
private String quotaProjectId;
@@ -236,6 +247,7 @@ protected Builder(StubSettings settings) {
236247
this.headerProvider = settings.headerProvider;
237248
this.internalHeaderProvider = settings.internalHeaderProvider;
238249
this.clock = settings.clock;
250+
this.serviceName = settings.serviceName;
239251
this.endpoint = settings.endpoint;
240252
this.mtlsEndpoint = settings.mtlsEndpoint;
241253
this.switchToMtlsEndpointAllowed = settings.switchToMtlsEndpointAllowed;
@@ -272,6 +284,7 @@ protected Builder(ClientContext clientContext) {
272284
this.headerProvider = new NoHeaderProvider();
273285
this.internalHeaderProvider = new NoHeaderProvider();
274286
this.clock = NanoClock.getDefaultClock();
287+
this.serviceName = null;
275288
this.endpoint = null;
276289
this.mtlsEndpoint = null;
277290
this.quotaProjectId = null;
@@ -292,6 +305,7 @@ protected Builder(ClientContext clientContext) {
292305
this.internalHeaderProvider =
293306
FixedHeaderProvider.create(clientContext.getInternalHeaders());
294307
this.clock = clientContext.getClock();
308+
this.serviceName = clientContext.getServiceName();
295309
this.endpoint = clientContext.getEndpoint();
296310
if (this.endpoint != null) {
297311
this.mtlsEndpoint = this.endpoint.replace("googleapis.com", "mtls.googleapis.com");

test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/ConnectionServiceStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,12 @@ public ConnectionServiceStub createStub() throws IOException {
182182
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
183183
}
184184

185+
/** Returns the default service name. */
186+
@Override
187+
public String getServiceName() {
188+
return "apigeeconnect";
189+
}
190+
185191
/** Returns a builder for the default ExecutorProvider for this service. */
186192
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
187193
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/apigeeconnect/src/com/google/cloud/apigeeconnect/v1/stub/TetherStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ public TetherStub createStub() throws IOException {
102102
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
103103
}
104104

105+
/** Returns the default service name. */
106+
@Override
107+
public String getServiceName() {
108+
return "apigeeconnect";
109+
}
110+
105111
/** Returns a builder for the default ExecutorProvider for this service. */
106112
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
107113
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/asset/src/com/google/cloud/asset/v1/stub/AssetServiceStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,12 @@ public AssetServiceStub createStub() throws IOException {
571571
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
572572
}
573573

574+
/** Returns the default service name. */
575+
@Override
576+
public String getServiceName() {
577+
return "cloudasset";
578+
}
579+
574580
/** Returns a builder for the default ExecutorProvider for this service. */
575581
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
576582
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/bigtable/src/com/google/cloud/bigtable/data/v2/stub/BigtableStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,12 @@ public BigtableStub createStub() throws IOException {
166166
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
167167
}
168168

169+
/** Returns the default service name. */
170+
@Override
171+
public String getServiceName() {
172+
return "bigtable";
173+
}
174+
169175
/** Returns a builder for the default ExecutorProvider for this service. */
170176
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
171177
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/compute/src/com/google/cloud/compute/v1small/stub/AddressesStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,12 @@ public AddressesStub createStub() throws IOException {
289289
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
290290
}
291291

292+
/** Returns the default service name. */
293+
@Override
294+
public String getServiceName() {
295+
return "compute";
296+
}
297+
292298
/** Returns a builder for the default ExecutorProvider for this service. */
293299
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
294300
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/compute/src/com/google/cloud/compute/v1small/stub/RegionOperationsStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,12 @@ public RegionOperationsStub createStub() throws IOException {
114114
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
115115
}
116116

117+
/** Returns the default service name. */
118+
@Override
119+
public String getServiceName() {
120+
return "compute";
121+
}
122+
117123
/** Returns a builder for the default ExecutorProvider for this service. */
118124
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
119125
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/credentials/src/com/google/cloud/iam/credentials/v1/stub/IamCredentialsStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,12 @@ public IamCredentialsStub createStub() throws IOException {
140140
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
141141
}
142142

143+
/** Returns the default service name. */
144+
@Override
145+
public String getServiceName() {
146+
return "iamcredentials";
147+
}
148+
143149
/** Returns a builder for the default ExecutorProvider for this service. */
144150
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
145151
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/iam/src/com/google/iam/v1/stub/IAMPolicyStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ public IAMPolicyStub createStub() throws IOException {
119119
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
120120
}
121121

122+
/** Returns the default service name. */
123+
@Override
124+
public String getServiceName() {
125+
return "iam-meta-api";
126+
}
127+
122128
/** Returns a builder for the default ExecutorProvider for this service. */
123129
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
124130
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/kms/src/com/google/cloud/kms/v1/stub/KeyManagementServiceStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,12 @@ public KeyManagementServiceStub createStub() throws IOException {
639639
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
640640
}
641641

642+
/** Returns the default service name. */
643+
@Override
644+
public String getServiceName() {
645+
return "cloudkms";
646+
}
647+
642648
/** Returns a builder for the default ExecutorProvider for this service. */
643649
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
644650
return InstantiatingExecutorProvider.newBuilder();

test/integration/goldens/library/src/com/google/cloud/example/library/v1/stub/LibraryServiceStubSettings.java

+6
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,12 @@ public LibraryServiceStub createStub() throws IOException {
306306
"Transport not supported: %s", getTransportChannelProvider().getTransportName()));
307307
}
308308

309+
/** Returns the default service name. */
310+
@Override
311+
public String getServiceName() {
312+
return "library-example";
313+
}
314+
309315
/** Returns a builder for the default ExecutorProvider for this service. */
310316
public static InstantiatingExecutorProvider.Builder defaultExecutorProviderBuilder() {
311317
return InstantiatingExecutorProvider.newBuilder();

0 commit comments

Comments
 (0)