diff --git a/java-spanner/samples/snippets/pom.xml b/java-spanner/samples/snippets/pom.xml index 23c24291e28d..d6efe02e45b2 100644 --- a/java-spanner/samples/snippets/pom.xml +++ b/java-spanner/samples/snippets/pom.xml @@ -34,7 +34,7 @@ com.google.cloud libraries-bom - 26.76.0 + 26.79.0 pom import @@ -228,7 +228,7 @@ false - com.example.spanner.admin.archived.SpannerSample + com.example.spanner.SpannerSample true lib/ diff --git a/java-spanner/samples/snippets/src/main/java/com/example/spanner/ExperimentalHostHelper.java b/java-spanner/samples/snippets/src/main/java/com/example/spanner/ExperimentalHostHelper.java new file mode 100644 index 000000000000..c47dca47f563 --- /dev/null +++ b/java-spanner/samples/snippets/src/main/java/com/example/spanner/ExperimentalHostHelper.java @@ -0,0 +1,66 @@ +/* + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.spanner; + +import com.google.cloud.spanner.SpannerOptions; +import com.google.common.base.Strings; + +public class ExperimentalHostHelper { + private static final String EXPERIMENTAL_HOST = "spanner.experimental_host"; + private static final String USE_PLAIN_TEXT = "spanner.use_plain_text"; + private static final String USE_MTLS = "spanner.mtls"; + private static final String CLIENT_CERT_PATH = "spanner.client_cert_path"; + private static final String CLIENT_CERT_KEY_PATH = "spanner.client_cert_key_path"; + + /** + * Checks whether an experimental host is being used. This is done by checking if the + * {@code spanner.experimental_host} system property is set. + * + * @return true if an experimental host is being used. Returns false otherwise. + */ + public static boolean isExperimentalHost() { + return !Strings.isNullOrEmpty(System.getProperty(EXPERIMENTAL_HOST)); + } + + public static boolean isMtlsSetup() { + return Boolean.getBoolean(USE_MTLS); + } + + public static void setExperimentalHostSpannerOptions(SpannerOptions.Builder builder) { + if (!isExperimentalHost()) { + throw new IllegalStateException(EXPERIMENTAL_HOST + " must be set to use this method"); + } + String experimentalHost = System.getProperty(EXPERIMENTAL_HOST, ""); + boolean usePlainText = Boolean.getBoolean(USE_PLAIN_TEXT); + builder.setExperimentalHost(experimentalHost); + builder.setBuiltInMetricsEnabled(false); + if (usePlainText) { + builder.usePlainText(); + } + if (isMtlsSetup()) { + String clientCertificate = System.getProperty(CLIENT_CERT_PATH, ""); + String clientKey = System.getProperty(CLIENT_CERT_KEY_PATH, ""); + if (Strings.isNullOrEmpty(clientCertificate)) { + throw new IllegalArgumentException(CLIENT_CERT_PATH + " must be set when mTLS is enabled"); + } + if (Strings.isNullOrEmpty(clientKey)) { + throw new IllegalArgumentException(CLIENT_CERT_KEY_PATH + " must be set when mTLS is enabled"); + } + builder.useClientCert(clientCertificate, clientKey); + } + } +} diff --git a/java-spanner/samples/snippets/src/main/java/com/example/spanner/MutableCredentialsExample.java b/java-spanner/samples/snippets/src/main/java/com/example/spanner/MutableCredentialsExample.java index fa6171180201..5a01fc2de9a2 100644 --- a/java-spanner/samples/snippets/src/main/java/com/example/spanner/MutableCredentialsExample.java +++ b/java-spanner/samples/snippets/src/main/java/com/example/spanner/MutableCredentialsExample.java @@ -33,6 +33,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; public class MutableCredentialsExample { diff --git a/java-spanner/samples/snippets/src/main/java/com/example/spanner/PgSpannerSample.java b/java-spanner/samples/snippets/src/main/java/com/example/spanner/PgSpannerSample.java index b3ad5cd08c44..661eba4b4b60 100644 --- a/java-spanner/samples/snippets/src/main/java/com/example/spanner/PgSpannerSample.java +++ b/java-spanner/samples/snippets/src/main/java/com/example/spanner/PgSpannerSample.java @@ -16,6 +16,9 @@ package com.example.spanner; +import static com.example.spanner.ExperimentalHostHelper.isExperimentalHost; +import static com.example.spanner.ExperimentalHostHelper.setExperimentalHostSpannerOptions; + import com.google.api.gax.paging.Page; import com.google.cloud.ByteArray; import com.google.cloud.Date; @@ -1192,17 +1195,19 @@ static void queryWithNumeric(DatabaseClient dbClient) { // [START spanner_postgresql_create_client_with_query_options] static void clientWithQueryOptions(DatabaseId db) { - SpannerOptions options = - SpannerOptions.newBuilder() - .setDefaultQueryOptions( + SpannerOptions.Builder builder = SpannerOptions.newBuilder(); + builder.setDefaultQueryOptions( db, ExecuteSqlRequest.QueryOptions .newBuilder() .setOptimizerVersion("1") // The list of available statistics packages can be found by querying the // "INFORMATION_SCHEMA.spanner_postgresql_STATISTICS" table. .setOptimizerStatisticsPackage("latest") - .build()) - .build(); + .build()); + if (isExperimentalHost()) { + setExperimentalHostSpannerOptions(builder); + } + SpannerOptions options = builder.build(); Spanner spanner = options.getService(); DatabaseClient dbClient = spanner.getDatabaseClient(db); try (ResultSet resultSet = @@ -1548,7 +1553,11 @@ public static void main(String[] args) { printUsageAndExit(); } // [START spanner_init_client] - SpannerOptions options = SpannerOptions.newBuilder().build(); + SpannerOptions.Builder builder = SpannerOptions.newBuilder(); + if (isExperimentalHost()) { + setExperimentalHostSpannerOptions(builder); + } + SpannerOptions options = builder.build(); Spanner spanner = options.getService(); DatabaseAdminClient dbAdminClient = null; try { diff --git a/java-spanner/samples/snippets/src/main/java/com/example/spanner/QueryInformationSchemaDatabaseOptionsSample.java b/java-spanner/samples/snippets/src/main/java/com/example/spanner/QueryInformationSchemaDatabaseOptionsSample.java index 814c74542cba..9ad2da4b6286 100644 --- a/java-spanner/samples/snippets/src/main/java/com/example/spanner/QueryInformationSchemaDatabaseOptionsSample.java +++ b/java-spanner/samples/snippets/src/main/java/com/example/spanner/QueryInformationSchemaDatabaseOptionsSample.java @@ -16,7 +16,10 @@ package com.example.spanner; -//[START spanner_query_information_schema_database_options] +// [START spanner_query_information_schema_database_options] + +import static com.example.spanner.ExperimentalHostHelper.isExperimentalHost; +import static com.example.spanner.ExperimentalHostHelper.setExperimentalHostSpannerOptions; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.DatabaseId; @@ -37,21 +40,23 @@ static void queryInformationSchemaDatabaseOptions() { static void queryInformationSchemaDatabaseOptions( String projectId, String instanceId, String databaseId) { - try (Spanner spanner = SpannerOptions - .newBuilder() - .setProjectId(projectId) - .build() - .getService()) { + SpannerOptions.Builder builder = SpannerOptions.newBuilder(); + builder.setProjectId(projectId); + if (isExperimentalHost()) { + setExperimentalHostSpannerOptions(builder); + } + try (Spanner spanner = builder.build().getService()) { final DatabaseId id = DatabaseId.of(projectId, instanceId, databaseId); final DatabaseClient databaseClient = spanner.getDatabaseClient(id); - try (ResultSet resultSet = databaseClient - .singleUse() - .executeQuery(Statement.of( - "SELECT OPTION_NAME, OPTION_VALUE" - + " FROM INFORMATION_SCHEMA.DATABASE_OPTIONS" - + " WHERE OPTION_NAME = 'default_leader'") - )) { + try (ResultSet resultSet = + databaseClient + .singleUse() + .executeQuery( + Statement.of( + "SELECT OPTION_NAME, OPTION_VALUE" + + " FROM INFORMATION_SCHEMA.DATABASE_OPTIONS" + + " WHERE OPTION_NAME = 'default_leader'"))) { if (resultSet.next()) { final String optionName = resultSet.getString("OPTION_NAME"); final String optionValue = resultSet.getString("OPTION_VALUE"); @@ -59,11 +64,10 @@ static void queryInformationSchemaDatabaseOptions( System.out.println("The " + optionName + " for " + id + " is " + optionValue); } else { System.out.println( - "Database " + id + " does not have a value for option 'default_leader'" - ); + "Database " + id + " does not have a value for option 'default_leader'"); } } } } } -//[END spanner_query_information_schema_database_options] +// [END spanner_query_information_schema_database_options] diff --git a/java-spanner/samples/snippets/src/main/java/com/example/spanner/SpannerGraphSample.java b/java-spanner/samples/snippets/src/main/java/com/example/spanner/SpannerGraphSample.java index ccb053133e56..3e07638de98e 100644 --- a/java-spanner/samples/snippets/src/main/java/com/example/spanner/SpannerGraphSample.java +++ b/java-spanner/samples/snippets/src/main/java/com/example/spanner/SpannerGraphSample.java @@ -16,6 +16,9 @@ package com.example.spanner; +import static com.example.spanner.ExperimentalHostHelper.isExperimentalHost; +import static com.example.spanner.ExperimentalHostHelper.setExperimentalHostSpannerOptions; + import com.google.cloud.Timestamp; import com.google.cloud.spanner.DatabaseClient; import com.google.cloud.spanner.DatabaseId; @@ -554,7 +557,11 @@ public static void main(String[] args) { if (args.length != 3 && args.length != 4) { printUsageAndExit(); } - SpannerOptions options = SpannerOptions.newBuilder().build(); + SpannerOptions.Builder builder = SpannerOptions.newBuilder(); + if (isExperimentalHost()) { + setExperimentalHostSpannerOptions(builder); + } + SpannerOptions options = builder.build(); Spanner spanner = options.getService(); DatabaseAdminClient dbAdminClient = null; try { diff --git a/java-spanner/samples/snippets/src/main/java/com/example/spanner/SpannerSample.java b/java-spanner/samples/snippets/src/main/java/com/example/spanner/SpannerSample.java index a01b00c0f6c3..697e1f894729 100644 --- a/java-spanner/samples/snippets/src/main/java/com/example/spanner/SpannerSample.java +++ b/java-spanner/samples/snippets/src/main/java/com/example/spanner/SpannerSample.java @@ -16,6 +16,9 @@ package com.example.spanner; +import static com.example.spanner.ExperimentalHostHelper.isExperimentalHost; +import static com.example.spanner.ExperimentalHostHelper.setExperimentalHostSpannerOptions; + import static com.google.cloud.spanner.Type.StructField; import com.google.api.gax.longrunning.OperationFuture; @@ -1503,17 +1506,19 @@ static void queryWithNumeric(DatabaseClient dbClient) { // [START spanner_create_client_with_query_options] static void clientWithQueryOptions(DatabaseId db) { - SpannerOptions options = - SpannerOptions.newBuilder() - .setDefaultQueryOptions( + SpannerOptions.Builder builder = SpannerOptions.newBuilder(); + builder.setDefaultQueryOptions( db, QueryOptions .newBuilder() .setOptimizerVersion("1") // The list of available statistics packages can be found by querying the // "INFORMATION_SCHEMA.SPANNER_STATISTICS" table. .setOptimizerStatisticsPackage("latest") - .build()) - .build(); + .build()); + if (isExperimentalHost()) { + setExperimentalHostSpannerOptions(builder); + } + SpannerOptions options = builder.build(); Spanner spanner = options.getService(); DatabaseClient dbClient = spanner.getDatabaseClient(db); try (ResultSet resultSet = @@ -2231,7 +2236,11 @@ public static void main(String[] args) { printUsageAndExit(); } // [START init_client] - SpannerOptions options = SpannerOptions.newBuilder().build(); + SpannerOptions.Builder builder = SpannerOptions.newBuilder(); + if (isExperimentalHost()) { + setExperimentalHostSpannerOptions(builder); + } + SpannerOptions options = builder.build(); Spanner spanner = options.getService(); DatabaseAdminClient dbAdminClient = null; try {