Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
import com.google.auth.Credentials;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.NoCredentials;
import com.google.cloud.spanner.adapter.SpannerCqlSessionBuilder.InstanceType;
import com.google.common.base.MoreObjects;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableSet;
import com.google.spanner.adapter.v1.AdapterClient;
import com.google.spanner.adapter.v1.AdapterSettings;
Expand Down Expand Up @@ -95,7 +95,7 @@ void start() {

try {
Credentials credentials = options.getCredentials();
if (options.usePlainText() || !Strings.isNullOrEmpty(options.getExperimentalHostEndpoint())) {
if (options.usePlainText() || options.getInstanceType() == InstanceType.OMNI) {
credentials = null;
} else if (credentials == null) {
credentials = GoogleCredentials.getApplicationDefault();
Expand All @@ -114,8 +114,7 @@ void start() {
if (options.usePlainText()) {
LOG.warn("Using plain text channel. This should not be used in production.");
channelProviderBuilder.setChannelConfigurator(ManagedChannelBuilder::usePlaintext);
} else if (!Strings.isNullOrEmpty(options.getExperimentalHostEndpoint())
&& options.useClientCert()) {
} else if (options.getInstanceType() == InstanceType.OMNI && options.useClientCert()) {
SslContext mTLSContext =
GrpcSslContexts.forClient()
.keyManager(
Expand Down Expand Up @@ -160,11 +159,7 @@ void start() {
options.getChannelProvider(), channelProviderBuilder.build()))
.setCredentialsProvider(credentialsProvider)
.setHeaderProvider(headerProvider);
if (!Strings.isNullOrEmpty(options.getExperimentalHostEndpoint())) {
settingsBuilder.setEndpoint(options.getExperimentalHostEndpoint());
} else {
settingsBuilder.setEndpoint(options.getSpannerEndpoint());
}
settingsBuilder.setEndpoint(options.getSpannerEndpoint());

AdapterSettings settings = settingsBuilder.build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.google.api.gax.rpc.TransportChannelProvider;
import com.google.auth.Credentials;
import com.google.cloud.spanner.adapter.SpannerCqlSessionBuilder.InstanceType;
import com.google.cloud.spanner.adapter.metrics.BuiltInMetricsRecorder;
import com.google.common.base.Strings;
import java.net.InetAddress;
Expand All @@ -25,7 +26,6 @@

/** Options for creating the {@link Adapter}. */
class AdapterOptions {

private static final String DEFAULT_SPANNER_ENDPOINT = "spanner.googleapis.com:443";
private static final int DEFAULT_NUM_GRPC_CHANNELS = 4;

Expand All @@ -42,13 +42,12 @@ static class Builder {
private BuiltInMetricsRecorder metricsRecorder;
private boolean useVirtualThreads = false;
private boolean usePlainText = false;
private String experimentalHostEndpoint = null;
private InstanceType instanceType = InstanceType.CLOUD;
private String clientCertPath = null;
private String clientKeyPath = null;

/** The Cloud Spanner endpoint. */
Builder spannerEndpoint(String spannerEndpoint) {
validateHostConflict(spannerEndpoint, this.experimentalHostEndpoint);
this.spannerEndpoint = spannerEndpoint;
return this;
}
Expand Down Expand Up @@ -118,30 +117,19 @@ Builder usePlainText(boolean usePlainText) {
return this;
}

/** (Optional) Experimental host endpoint. */
Builder setExperimentalHostEndpoint(String experimentalHostEndpoint) {
validateHostConflict(this.spannerEndpoint, experimentalHostEndpoint);
this.experimentalHostEndpoint = experimentalHostEndpoint;
/** (Optional) Set the instance type. */
Builder setInstanceType(InstanceType instanceType) {
this.instanceType = instanceType;
return this;
}

/** (Optional) Use mTLS connection to communicate with Experimental Host instance. */
/** (Optional) Use mTLS connection to communicate with Spanner Omni instance. */
Builder useClientCert(String clientCertPath, String clientKeyPath) {
this.clientCertPath = clientCertPath;
this.clientKeyPath = clientKeyPath;
return this;
}

private void validateHostConflict(
String spannerEndpointToCheck, String experimentalHostEndpointToCheck) {
if (!Strings.isNullOrEmpty(spannerEndpointToCheck)
&& !spannerEndpointToCheck.equals(DEFAULT_SPANNER_ENDPOINT)
&& !Strings.isNullOrEmpty(experimentalHostEndpointToCheck)) {
throw new IllegalArgumentException(
"Only one of Spanner Host or Experimental Host can be set.");
}
}

AdapterOptions build() {
return new AdapterOptions(this);
}
Expand All @@ -158,7 +146,7 @@ AdapterOptions build() {
private BuiltInMetricsRecorder metricsRecorder;
private boolean useVirtualThreads;
private boolean usePlainText;
private String experimentalHostEndpoint;
private InstanceType instanceType;
private String clientCertPath;
private String clientKeyPath;

Expand All @@ -174,7 +162,7 @@ private AdapterOptions(Builder builder) {
this.metricsRecorder = builder.metricsRecorder;
this.useVirtualThreads = builder.useVirtualThreads;
this.usePlainText = builder.usePlainText;
this.experimentalHostEndpoint = builder.experimentalHostEndpoint;
this.instanceType = builder.instanceType;
this.clientCertPath = builder.clientCertPath;
this.clientKeyPath = builder.clientKeyPath;
}
Expand Down Expand Up @@ -227,8 +215,8 @@ boolean usePlainText() {
return usePlainText;
}

String getExperimentalHostEndpoint() {
return experimentalHostEndpoint;
InstanceType getInstanceType() {
return instanceType;
}

boolean useClientCert() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

import com.google.cloud.spanner.adapter.metrics.BuiltInMetricsProvider;
import com.google.cloud.spanner.adapter.metrics.BuiltInMetricsRecorder;
import com.google.common.base.Strings;
import com.google.spanner.adapter.v1.DatabaseName;
import io.opentelemetry.api.OpenTelemetry;
import java.io.IOException;
Expand Down Expand Up @@ -100,7 +99,7 @@ public class Launcher {
private static final BuiltInMetricsProvider builtInMetricsProvider =
BuiltInMetricsProvider.INSTANCE;

private static final String EXPERIMENTAL_HOST_ID = "default";
private static final String SPANNER_OMNI_ID = "default";
private final AdapterFactory adapterFactory;
private final List<Adapter> adapters = new ArrayList<>();
private HealthCheckServer healthCheckServer;
Expand Down Expand Up @@ -229,7 +228,7 @@ private AdapterOptions buildAdapterOptions(
.numGrpcChannels(config.getNumGrpcChannels())
.metricsRecorder(metricsRecorder)
.usePlainText(config.usePlainText())
.setExperimentalHostEndpoint(config.getExperimentalHostEndpoint())
.setInstanceType(config.getInstanceType())
.useClientCert(config.getClientCertPath(), config.getClientKeyPath());
if (config.getMaxCommitDelayMillis() != null) {
opBuilder.maxCommitDelay(Duration.ofMillis(config.getMaxCommitDelayMillis()));
Expand All @@ -255,8 +254,8 @@ private DatabaseName resolveDatabaseName(ListenerConfig config) {
return DatabaseName.parse(uriOrId);
}

if (!Strings.isNullOrEmpty(config.getExperimentalHostEndpoint())) {
return DatabaseName.of(EXPERIMENTAL_HOST_ID, EXPERIMENTAL_HOST_ID, uriOrId);
if (config.getInstanceType() == SpannerCqlSessionBuilder.InstanceType.OMNI) {
return DatabaseName.of(SPANNER_OMNI_ID, SPANNER_OMNI_ID, uriOrId);
}

// User is trying to connect to Cloud Spanner instance with an invalid database URI. We
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package com.google.cloud.spanner.adapter;

import com.google.cloud.spanner.adapter.SpannerCqlSessionBuilder.InstanceType;
import com.google.cloud.spanner.adapter.configs.ConfigConstants;
import com.google.cloud.spanner.adapter.configs.ListenerConfigs;
import com.google.cloud.spanner.adapter.configs.UserConfigs;
Expand Down Expand Up @@ -60,16 +61,24 @@ static LauncherConfig fromUserConfigs(UserConfigs userConfigs) throws UnknownHos
final String globalSpannerEndpoint;
final boolean globalEnableBuiltInMetrics;
final boolean usePlainText;
final String experimentalHostEndpoint;
final InstanceType instanceType;
final String clientCertPath;
final String clientKeyPath;
HealthCheckConfig healthCheckConfig = null;

if (userConfigs.getGlobalClientConfigs() != null) {
globalSpannerEndpoint =
userConfigs.getGlobalClientConfigs().getSpannerEndpoint() != null
? userConfigs.getGlobalClientConfigs().getSpannerEndpoint()
: ConfigConstants.DEFAULT_SPANNER_ENDPOINT;
String expHost = userConfigs.getGlobalClientConfigs().getExperimentalHostEndpoint();
InstanceType type = userConfigs.getGlobalClientConfigs().getInstanceType();
if (!Strings.isNullOrEmpty(expHost)) {
globalSpannerEndpoint = expHost;
instanceType = InstanceType.OMNI;
} else {
globalSpannerEndpoint =
userConfigs.getGlobalClientConfigs().getSpannerEndpoint() != null
? userConfigs.getGlobalClientConfigs().getSpannerEndpoint()
: ConfigConstants.DEFAULT_SPANNER_ENDPOINT;
instanceType = type != null ? type : InstanceType.CLOUD;
}
globalEnableBuiltInMetrics =
userConfigs.getGlobalClientConfigs().getEnableBuiltInMetrics() != null
&& userConfigs.getGlobalClientConfigs().getEnableBuiltInMetrics();
Expand All @@ -81,14 +90,13 @@ static LauncherConfig fromUserConfigs(UserConfigs userConfigs) throws UnknownHos
usePlainText =
userConfigs.getGlobalClientConfigs().getUsePlainText() != null
&& userConfigs.getGlobalClientConfigs().getUsePlainText();
experimentalHostEndpoint = userConfigs.getGlobalClientConfigs().getExperimentalHostEndpoint();
clientCertPath = userConfigs.getGlobalClientConfigs().getClientCertPath();
clientKeyPath = userConfigs.getGlobalClientConfigs().getClientKeyPath();
} else {
globalSpannerEndpoint = ConfigConstants.DEFAULT_SPANNER_ENDPOINT;
globalEnableBuiltInMetrics = false;
usePlainText = false;
experimentalHostEndpoint = null;
instanceType = InstanceType.CLOUD;
clientCertPath = null;
clientKeyPath = null;
}
Expand All @@ -102,7 +110,7 @@ static LauncherConfig fromUserConfigs(UserConfigs userConfigs) throws UnknownHos
globalSpannerEndpoint,
globalEnableBuiltInMetrics,
usePlainText,
experimentalHostEndpoint,
instanceType,
clientCertPath,
clientKeyPath));
}
Expand Down Expand Up @@ -138,7 +146,7 @@ private static void validateListenerConfig(ListenerConfigs listener) {

/** Encapsulates the configuration for a single Adapter listener. */
final class ListenerConfig {
private static final String EXPERIMENTAL_HOST_ID = "default";
private static final String SPANNER_OMNI_ID = "default";
private final String databaseUri;
private final InetAddress hostAddress;
private final int port;
Expand All @@ -147,7 +155,7 @@ final class ListenerConfig {
@Nullable private final Integer maxCommitDelayMillis;
private final boolean enableBuiltInMetrics;
private final boolean usePlainText;
private final String experimentalHostEndpoint;
private final InstanceType instanceType;
private String clientCertPath;
private String clientKeyPath;

Expand All @@ -160,7 +168,7 @@ private ListenerConfig(Builder builder) {
this.maxCommitDelayMillis = builder.maxCommitDelayMillis;
this.enableBuiltInMetrics = builder.enableBuiltInMetrics;
this.usePlainText = builder.usePlainText;
this.experimentalHostEndpoint = builder.experimentalHostEndpoint;
this.instanceType = builder.instanceType;
this.clientCertPath = builder.clientCertPath;
this.clientKeyPath = builder.clientKeyPath;
}
Expand Down Expand Up @@ -198,8 +206,8 @@ public boolean usePlainText() {
return usePlainText;
}

public String getExperimentalHostEndpoint() {
return experimentalHostEndpoint;
public InstanceType getInstanceType() {
return instanceType;
}

public String getClientCertPath() {
Expand All @@ -215,7 +223,7 @@ static ListenerConfig fromListenerConfigs(
String globalSpannerEndpoint,
boolean globalEnableBuiltInMetrics,
boolean usePlainText,
String experimentalHostEndpoint,
InstanceType instanceType,
String clientCertPath,
String clientKeyPath)
throws UnknownHostException {
Expand All @@ -235,7 +243,7 @@ static ListenerConfig fromListenerConfigs(
.numGrpcChannels(numGrpcChannels)
.maxCommitDelayMillis(maxCommitDelayMillis)
.enableBuiltInMetrics(globalEnableBuiltInMetrics)
.setExperimentalHostEndpoint(experimentalHostEndpoint)
.setInstanceType(instanceType)
.usePlainText(usePlainText)
.useClientCert(clientCertPath, clientKeyPath)
.build();
Expand Down Expand Up @@ -265,15 +273,21 @@ static ListenerConfig fromProperties(Map<String, String> properties) throws Unkn
boolean usePlainText =
Boolean.parseBoolean(
properties.getOrDefault(ConfigConstants.USE_PLAINTEXT_PROP_KEY, "false"));
String typeStr = properties.get(ConfigConstants.INSTANCE_TYPE_PROP_KEY);
InstanceType instanceType =
typeStr != null ? InstanceType.valueOf(typeStr.toUpperCase()) : InstanceType.CLOUD;
String experimentalHostEndpoint =
properties.get(ConfigConstants.EXPERIMENTAL_HOST_ENDPOINT_PROP_KEY);
if (!Strings.isNullOrEmpty(experimentalHostEndpoint)) {
spannerEndpoint = experimentalHostEndpoint;
instanceType = InstanceType.OMNI;
}
String clientCertPath = properties.get(ConfigConstants.CLIENT_CERT_PATH_PROP_KEY);
String clientKeyPath = properties.get(ConfigConstants.CLIENT_KEY_PATH_PROP_KEY);
String databaseUri = properties.get(ConfigConstants.DATABASE_URI_PROP_KEY);
if (!Strings.isNullOrEmpty(experimentalHostEndpoint)) {
if (instanceType == InstanceType.OMNI) {
if (!DatabaseName.isParsableFrom(databaseUri)) {
databaseUri =
DatabaseName.of(EXPERIMENTAL_HOST_ID, EXPERIMENTAL_HOST_ID, databaseUri).toString();
databaseUri = DatabaseName.of(SPANNER_OMNI_ID, SPANNER_OMNI_ID, databaseUri).toString();
}
}

Expand All @@ -286,7 +300,7 @@ static ListenerConfig fromProperties(Map<String, String> properties) throws Unkn
.maxCommitDelayMillis(maxCommitDelayMillis)
.enableBuiltInMetrics(enableBuiltInMetrics)
.usePlainText(usePlainText)
.setExperimentalHostEndpoint(experimentalHostEndpoint)
.setInstanceType(instanceType)
.useClientCert(clientCertPath, clientKeyPath)
.build();
}
Expand All @@ -304,20 +318,10 @@ static class Builder {
@Nullable private Integer maxCommitDelayMillis;
private boolean enableBuiltInMetrics;
private boolean usePlainText;
private String experimentalHostEndpoint;
private InstanceType instanceType = InstanceType.CLOUD;
private String clientCertPath;
private String clientKeyPath;

private void validateHostConflict(
String spannerEndpointToCheck, String experimentalHostEndpointToCheck) {
if (!Strings.isNullOrEmpty(spannerEndpointToCheck)
&& !spannerEndpointToCheck.equals(ConfigConstants.DEFAULT_SPANNER_ENDPOINT)
&& !Strings.isNullOrEmpty(experimentalHostEndpointToCheck)) {
throw new IllegalArgumentException(
"Only one of Spanner Host or Experimental Host can be set.");
}
}

public Builder databaseUri(String databaseUri) {
this.databaseUri = databaseUri;
return this;
Expand All @@ -334,7 +338,6 @@ public Builder port(int port) {
}

public Builder spannerEndpoint(String spannerEndpoint) {
validateHostConflict(spannerEndpoint, this.experimentalHostEndpoint);
this.spannerEndpoint = spannerEndpoint;
return this;
}
Expand All @@ -359,9 +362,8 @@ public Builder usePlainText(boolean usePlainText) {
return this;
}

public Builder setExperimentalHostEndpoint(String experimentalHostEndpoint) {
validateHostConflict(this.spannerEndpoint, experimentalHostEndpoint);
this.experimentalHostEndpoint = experimentalHostEndpoint;
public Builder setInstanceType(InstanceType instanceType) {
this.instanceType = instanceType;
return this;
}

Expand Down
Loading
Loading