Skip to content

Commit

Permalink
feat: Add default endpoint and default mtls endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
lqiu96 committed Nov 7, 2023
1 parent 6e6439c commit 2df163f
Show file tree
Hide file tree
Showing 35 changed files with 174 additions and 160 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1880,14 +1880,14 @@ protected MethodDefinition createNestedClassCreateDefaultMethod(
bodyExprs.add(
MethodInvocationExpr.builder()
.setExprReferenceExpr(builderVarExpr)
.setMethodName("setEndpoint")
.setMethodName("setDefaultEndpoint")
.setArguments(
MethodInvocationExpr.builder().setMethodName("getDefaultEndpoint").build())
.build());
bodyExprs.add(
MethodInvocationExpr.builder()
.setExprReferenceExpr(builderVarExpr)
.setMethodName("setMtlsEndpoint")
.setMethodName("setDefaultMtlsEndpoint")
.setArguments(
MethodInvocationExpr.builder().setMethodName("getDefaultMtlsEndpoint").build())
.build());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,8 +235,8 @@ public class DeprecatedServiceStubSettings extends StubSettings<DeprecatedServic
builder.setTransportChannelProvider(defaultTransportChannelProvider());
builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build());
builder.setEndpoint(getDefaultEndpoint());
builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setDefaultEndpoint(getDefaultEndpoint());
builder.setDefaultMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setSwitchToMtlsEndpointAllowed(true);

return initDefaults(builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -484,8 +484,8 @@ public class EchoStubSettings extends StubSettings<EchoStubSettings> {
builder.setTransportChannelProvider(defaultTransportChannelProvider());
builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build());
builder.setEndpoint(getDefaultEndpoint());
builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setDefaultEndpoint(getDefaultEndpoint());
builder.setDefaultMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setSwitchToMtlsEndpointAllowed(true);

return initDefaults(builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -620,8 +620,8 @@ public class LoggingServiceV2StubSettings extends StubSettings<LoggingServiceV2S
builder.setTransportChannelProvider(defaultTransportChannelProvider());
builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build());
builder.setEndpoint(getDefaultEndpoint());
builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setDefaultEndpoint(getDefaultEndpoint());
builder.setDefaultMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setSwitchToMtlsEndpointAllowed(true);

return initDefaults(builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -661,8 +661,8 @@ public class PublisherStubSettings extends StubSettings<PublisherStubSettings> {
builder.setTransportChannelProvider(defaultTransportChannelProvider());
builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build());
builder.setEndpoint(getDefaultEndpoint());
builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setDefaultEndpoint(getDefaultEndpoint());
builder.setDefaultMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setSwitchToMtlsEndpointAllowed(true);

return initDefaults(builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -512,8 +512,8 @@ public class EchoStubSettings extends StubSettings<EchoStubSettings> {
builder.setTransportChannelProvider(defaultTransportChannelProvider());
builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build());
builder.setEndpoint(getDefaultEndpoint());
builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setDefaultEndpoint(getDefaultEndpoint());
builder.setDefaultMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setSwitchToMtlsEndpointAllowed(true);

return initDefaults(builder);
Expand All @@ -525,8 +525,8 @@ public class EchoStubSettings extends StubSettings<EchoStubSettings> {
builder.setTransportChannelProvider(defaultHttpJsonTransportProviderBuilder().build());
builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
builder.setInternalHeaderProvider(defaultHttpJsonApiClientHeaderProviderBuilder().build());
builder.setEndpoint(getDefaultEndpoint());
builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setDefaultEndpoint(getDefaultEndpoint());
builder.setDefaultMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setSwitchToMtlsEndpointAllowed(true);

return initDefaults(builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,8 +231,8 @@ public class WickedStubSettings extends StubSettings<WickedStubSettings> {
builder.setTransportChannelProvider(defaultTransportChannelProvider());
builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build());
builder.setEndpoint(getDefaultEndpoint());
builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setDefaultEndpoint(getDefaultEndpoint());
builder.setDefaultMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setSwitchToMtlsEndpointAllowed(true);

return initDefaults(builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -302,8 +302,8 @@ public class ComplianceStubSettings extends StubSettings<ComplianceStubSettings>
builder.setTransportChannelProvider(defaultTransportChannelProvider());
builder.setCredentialsProvider(defaultCredentialsProviderBuilder().build());
builder.setInternalHeaderProvider(defaultApiClientHeaderProviderBuilder().build());
builder.setEndpoint(getDefaultEndpoint());
builder.setMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setDefaultEndpoint(getDefaultEndpoint());
builder.setDefaultMtlsEndpoint(getDefaultMtlsEndpoint());
builder.setSwitchToMtlsEndpointAllowed(true);

return initDefaults(builder);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,19 @@
@InternalApi
@AutoValue
public abstract class EndpointContext {
private static final String DEFAULT_UNIVERSE_DOMAIN = "googleapis.com";
private static final String GOOGLE_DEFAULT_UNIVERSE = "googleapis.com";
private static final String DEFAULT_PORT = "443";
private static final String UNIVERSE_DOMAIN_TEMPLATE =
"https://SERVICE_NAME.UNIVERSE_DOMAIN:PORT";
private static final Pattern ENDPOINT_REGEX =
Pattern.compile("^(https\\:\\/\\/)?(www.)?[a-zA-Z]+\\.[\\S]+(\\:\\d)?$");

@Nullable
public abstract String defaultEndpoint();

@Nullable
public abstract String defaultMtlsEndpoint();

@Nullable
public abstract String clientSettingsEndpoint();

Expand Down Expand Up @@ -79,48 +85,40 @@ public static Builder newBuilder() {
// By default, the clientSettingsEndpoint value is the default_host endpoint
// value configured in the service. Users can override this value by the Setter
// exposed in the Client/Stub Settings or in the TransportChannelProvider.
private void determineEndpoint() throws IOException {
@VisibleForTesting
void determineEndpoint() throws IOException {
if (resolvedEndpoint != null && resolvedUniverseDomain != null) {
return;
}
MtlsProvider mtlsProvider = mtlsProvider() == null ? new MtlsProvider() : mtlsProvider();
String customEndpoint =
transportChannelEndpoint() != null ? transportChannelEndpoint() : clientSettingsEndpoint();
// If both endpoint values are null, the client is unable to parse the serviceName
// This means that there are no user configured endpoints, use the default endpoint
if (customEndpoint == null) {
// throw new Exception("No endpoint was set for the client");
if (switchToMtlsEndpointAllowed() && mtlsProvider != null) {
resolvedEndpoint =
mtlsEndpointResolver(mtlsProvider, defaultEndpoint(), defaultMtlsEndpoint());
} else {
resolvedEndpoint = defaultEndpoint();
}
resolvedUniverseDomain = GOOGLE_DEFAULT_UNIVERSE;
return;
}
Matcher matcher = ENDPOINT_REGEX.matcher(customEndpoint);
// Check if it matches the format in the template
// Check if it matches the ENDPOINT_TEMPLATE format
if (!matcher.matches()) {
// Throw an exception if user's endpoint is not valid
// throw new Exception("Invalid endpoint: " + customEndpoint);
resolvedEndpoint = customEndpoint;
resolvedUniverseDomain = GOOGLE_DEFAULT_UNIVERSE;
return;
}

MtlsProvider mtlsProvider = mtlsProvider() == null ? new MtlsProvider() : mtlsProvider();
boolean isUsingMtlsEndpoint = false;
if (switchToMtlsEndpointAllowed() && mtlsProvider != null) {
switch (mtlsProvider.getMtlsEndpointUsagePolicy()) {
case ALWAYS:
customEndpoint = mtlsEndpoint();
isUsingMtlsEndpoint = true;
break;
case NEVER:
// CustomEndpoint is already set
break;
default:
if (mtlsProvider.useMtlsClientCertificate() && mtlsProvider.getKeyStore() != null) {
customEndpoint = mtlsEndpoint();
isUsingMtlsEndpoint = true;
break;
}
}
customEndpoint = mtlsEndpointResolver(mtlsProvider, customEndpoint, defaultMtlsEndpoint());
}
// mTLS is not supported yet. If mTLS is enabled, use that endpoint.
if (isUsingMtlsEndpoint) {
resolvedEndpoint = mtlsEndpoint();
resolvedUniverseDomain = DEFAULT_UNIVERSE_DOMAIN;
// mTLS will always be in the GDU, for now
if (customEndpoint.contains("mtls")) {
resolvedEndpoint = customEndpoint;
resolvedUniverseDomain = GOOGLE_DEFAULT_UNIVERSE;
return;
}

Expand All @@ -130,7 +128,7 @@ private void determineEndpoint() throws IOException {

int periodIndex = customEndpoint.indexOf('.');
int colonIndex = customEndpoint.indexOf(':');
String serviceName;
String serviceName = customEndpoint.substring(0, periodIndex);
String universeDomain;
String port = "443";
if (colonIndex != -1) {
Expand All @@ -139,15 +137,25 @@ private void determineEndpoint() throws IOException {
} else {
universeDomain = customEndpoint.substring(periodIndex + 1);
}
serviceName = customEndpoint.substring(0, periodIndex);

// TODO: Build out logic for resolving endpoint
resolvedEndpoint = buildEndpoint(serviceName, universeDomain, port);
resolvedUniverseDomain = universeDomain;
}

private String buildEndpoint(String serviceName) {
return buildEndpoint(serviceName, DEFAULT_UNIVERSE_DOMAIN, DEFAULT_PORT);
private String mtlsEndpointResolver(
MtlsProvider mtlsProvider, String endpoint, String mtlsEndpoint) throws IOException {
switch (mtlsProvider.getMtlsEndpointUsagePolicy()) {
case ALWAYS:
return mtlsEndpoint;
case NEVER:
return endpoint;
default:
if (mtlsProvider.useMtlsClientCertificate() && mtlsProvider.getKeyStore() != null) {
return mtlsEndpoint;
}
return endpoint;
}
}

private String buildEndpoint(String serviceName, String universeDomain, String port) {
Expand All @@ -173,6 +181,10 @@ public String resolveUniverseDomain(Credentials credentials) throws IOException

@AutoValue.Builder
public abstract static class Builder {
protected abstract Builder setDefaultEndpoint(String defaultEndpoint);

protected abstract Builder setDefaultMtlsEndpoint(String defaultMtlsEndpiont);

public abstract Builder setClientSettingsEndpoint(String clientSettingsEndpoint);

public abstract Builder setTransportChannelEndpoint(String transportChannelEndpoint);
Expand Down
58 changes: 30 additions & 28 deletions gax-java/gax/src/main/java/com/google/api/gax/rpc/StubSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ protected StubSettings(Builder builder) {
this.universeDomain = builder.universeDomain;
this.mtlsEndpoint = builder.mtlsEndpoint;
this.switchToMtlsEndpointAllowed = builder.switchToMtlsEndpointAllowed;
this.endpointContext = builder.endpointContext;
this.endpointContext = builder.endpointContextBuilder.build();
this.quotaProjectId = builder.quotaProjectId;
this.streamWatchdogProvider = builder.streamWatchdogProvider;
this.streamWatchdogCheckInterval = builder.streamWatchdogCheckInterval;
Expand Down Expand Up @@ -259,7 +259,7 @@ public abstract static class Builder<
@Nonnull private Duration streamWatchdogCheckInterval;
@Nonnull private ApiTracerFactory tracerFactory;
private boolean deprecatedExecutorProviderSet;
@Nonnull private EndpointContext endpointContext;
@Nonnull private EndpointContext.Builder endpointContextBuilder;

/**
* Indicate when creating transport whether it is allowed to use mTLS endpoint instead of the
Expand All @@ -281,7 +281,7 @@ protected Builder(StubSettings settings) {
this.universeDomain = settings.universeDomain;
this.mtlsEndpoint = settings.mtlsEndpoint;
this.switchToMtlsEndpointAllowed = settings.switchToMtlsEndpointAllowed;
this.endpointContext = settings.endpointContext;
this.endpointContextBuilder = settings.endpointContext.toBuilder();
this.quotaProjectId = settings.quotaProjectId;
this.streamWatchdogProvider = settings.streamWatchdogProvider;
this.streamWatchdogCheckInterval = settings.streamWatchdogCheckInterval;
Expand Down Expand Up @@ -318,7 +318,7 @@ protected Builder(ClientContext clientContext) {
this.endpoint = null;
this.universeDomain = null;
this.mtlsEndpoint = null;
this.endpointContext = EndpointContext.newBuilder().build();
this.endpointContextBuilder = EndpointContext.newBuilder();
this.quotaProjectId = null;
this.streamWatchdogProvider = InstantiatingWatchdogProvider.create();
this.streamWatchdogCheckInterval = Duration.ofSeconds(10);
Expand All @@ -342,14 +342,13 @@ protected Builder(ClientContext clientContext) {
if (this.endpoint != null) {
this.mtlsEndpoint = this.endpoint.replace("googleapis.com", "mtls.googleapis.com");
}
this.endpointContext =
this.endpointContextBuilder =
EndpointContext.newBuilder()
.setClientSettingsEndpoint(clientContext.getEndpoint())
.setDefaultEndpoint(clientContext.getEndpoint())
.setTransportChannelEndpoint(transportChannelProvider.getEndpoint())
.setMtlsEndpoint(mtlsEndpoint)
.setDefaultMtlsEndpoint(mtlsEndpoint)
.setSwitchToMtlsEndpointAllowed(switchToMtlsEndpointAllowed)
.setUniverseDomain(clientContext.getUniverseDomain())
.build();
.setUniverseDomain(clientContext.getUniverseDomain());
this.streamWatchdogProvider =
FixedWatchdogProvider.create(clientContext.getStreamWatchdog());
this.streamWatchdogCheckInterval = clientContext.getStreamWatchdogCheckInterval();
Expand Down Expand Up @@ -445,11 +444,9 @@ protected B setInternalHeaderProvider(HeaderProvider internalHeaderProvider) {
*/
public B setTransportChannelProvider(TransportChannelProvider transportChannelProvider) {
this.transportChannelProvider = transportChannelProvider;
this.endpointContext =
this.endpointContext
.toBuilder()
.setTransportChannelEndpoint(transportChannelProvider.getEndpoint())
.build();
this.endpointContextBuilder =
this.endpointContextBuilder.setTransportChannelEndpoint(
transportChannelProvider.getEndpoint());
return self();
}

Expand All @@ -473,42 +470,47 @@ public B setClock(ApiClock clock) {
return self();
}

protected B setDefaultEndpoint(String defaultEndpoint) {
this.endpointContextBuilder = this.endpointContextBuilder.setDefaultEndpoint(defaultEndpoint);
return self();
}

protected B setDefaultMtlsEndpoint(String defaultMtlsEndpoint) {
this.endpointContextBuilder =
this.endpointContextBuilder.setDefaultMtlsEndpoint(defaultMtlsEndpoint);
return self();
}

public B setEndpoint(String endpoint) {
this.endpoint = endpoint;
this.switchToMtlsEndpointAllowed = false;
if (this.endpoint != null && this.mtlsEndpoint == null) {
this.mtlsEndpoint = this.endpoint.replace("googleapis.com", "mtls.googleapis.com");
}
this.endpointContext =
this.endpointContext
.toBuilder()
this.endpointContextBuilder =
this.endpointContextBuilder
.setClientSettingsEndpoint(endpoint)
.setMtlsEndpoint(mtlsEndpoint)
.setSwitchToMtlsEndpointAllowed(switchToMtlsEndpointAllowed)
.build();
.setSwitchToMtlsEndpointAllowed(false);
return self();
}

public B setUniverseDomain(String universeDomain) {
this.universeDomain = universeDomain;
this.endpointContext =
this.endpointContext.toBuilder().setUniverseDomain(universeDomain).build();
this.endpointContextBuilder = this.endpointContextBuilder.setUniverseDomain(universeDomain);
return self();
}

protected B setSwitchToMtlsEndpointAllowed(boolean switchToMtlsEndpointAllowed) {
this.switchToMtlsEndpointAllowed = switchToMtlsEndpointAllowed;
this.endpointContext =
this.endpointContext
.toBuilder()
.setSwitchToMtlsEndpointAllowed(switchToMtlsEndpointAllowed)
.build();
this.endpointContextBuilder =
this.endpointContextBuilder.setSwitchToMtlsEndpointAllowed(switchToMtlsEndpointAllowed);
return self();
}

public B setMtlsEndpoint(String mtlsEndpoint) {
this.mtlsEndpoint = mtlsEndpoint;
this.endpointContext = this.endpointContext.toBuilder().setMtlsEndpoint(mtlsEndpoint).build();
this.endpointContextBuilder = this.endpointContextBuilder.setMtlsEndpoint(mtlsEndpoint);
return self();
}

Expand Down Expand Up @@ -648,7 +650,7 @@ public String toString() {
.add("clock", clock)
.add("endpoint", endpoint)
.add("universeDomain", universeDomain)
.add("endpointContext", endpointContext)
.add("endpointContextBuilder", endpointContextBuilder)
.add("mtlsEndpoint", mtlsEndpoint)
.add("switchToMtlsEndpointAllowed", switchToMtlsEndpointAllowed)
.add("quotaProjectId", quotaProjectId)
Expand Down
Loading

0 comments on commit 2df163f

Please sign in to comment.