Add configuration for Google credentials
Update libraries to allow use of GoogleCredentials.
Change-Id: Ic243b0a950955bae891210e30cb8975768b6743b
diff --git a/BUILD b/BUILD
index 6ae07a1..5b434d5 100644
--- a/BUILD
+++ b/BUILD
@@ -30,8 +30,6 @@
"@gax-httpjson//jar",
"@gax//jar",
"@global-refdb//jar",
- "@google-api-client-json//jar",
- "@google-api-client//jar",
"@google-api-common//jar",
"@google-auth-library-credentials//jar",
"@google-auth-library-oauth2-http//jar",
@@ -39,8 +37,11 @@
"@google-cloud-core//jar",
"@google-cloud-spanner//jar",
"@google-cloud-storage//jar",
+ "@google-code-gson//jar",
"@google-http-client-gson//jar",
+ "@google-http-client-jackson//jar",
"@google-http-client//jar",
+ "@google-oauth-client-jetty//jar",
"@grpc-alts//jar",
"@grpc-api//jar",
"@grpc-auth//jar",
@@ -123,5 +124,6 @@
"@google-cloud-spanner//jar",
"@testcontainer-localstack//jar",
"@testcontainers//jar",
+ "@google-auth-library-oauth2-http//jar",
],
)
diff --git a/README.md b/README.md
index 54136ee..4c77967 100644
--- a/README.md
+++ b/README.md
@@ -55,4 +55,8 @@
## Configuration options
Configuration details can be found in the
-[spanner-refdb config documentation](src/main/resources/Documentation/config.md).
\ No newline at end of file
+[spanner-refdb config documentation](src/main/resources/Documentation/config.md).
+
+When not used with the emulator, the plugin requires the path to credentials in
+the config to authenticate with google. To create the key see the
+[official documentation](https://cloud.google.com/iam/docs/keys-create-delete).
\ No newline at end of file
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index bf9d40d..b4dba16 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -7,7 +7,7 @@
PROTOBUF_JAVA_VER = "3.21.12"
OPENCENSUS_VER = "0.31.1"
OPENCENSUS_PROTO_VER = "0.2.0"
-GOOGLE_HTTP_CLIENT_VER = "1.43.1"
+GOOGLE_HTTP_CLIENT_VER = "1.43.3"
CLOUD_CORE_VER = "2.12.0"
GOOGLE_COMMON_PROTOS_VERS = "2.14.2"
@@ -138,24 +138,24 @@
artifact = "io.grpc:grpc-core:" + GRPC_VER,
)
maven_jar(
- name = "grpc-context",
- sha1 = "70aa77c3e715b6f22a42c466eb2f48031bc468fb",
- artifact = "io.grpc:grpc-context:" + GRPC_VER,
- )
- maven_jar(
name = "gax-httpjson",
sha1 = "2aad7ab9500a4188f8d0967244c21ce6a023cd80",
artifact = "com.google.api:gax-httpjson:0.108.2",
)
maven_jar(
+ name = "grpc-context",
+ sha1 = "70aa77c3e715b6f22a42c466eb2f48031bc468fb",
+ artifact = "io.grpc:grpc-context:" + GRPC_VER,
+ )
+ maven_jar(
name = "gax-grpc",
- sha1 = "f72d1ac348b29ed121e0166d875e8d22db7c3a7a",
- artifact = "com.google.api:gax-grpc:2.23.3",
+ sha1 = "70a13c321fb0042b40fd363e92fcc02f669416c0",
+ artifact = "com.google.api:gax-grpc:2.32.0",
)
maven_jar(
name = "gax",
- sha1 = "34442411d1ae36c61508189c4d198ef69dbde4ab",
- artifact = "com.google.api:gax:2.23.3",
+ sha1 = "522bf3c2a738847b9719eac8ce572be0f84da40a",
+ artifact = "com.google.api:gax:2.32.0",
)
maven_jar(
name = "grpc-gcp",
@@ -208,6 +208,11 @@
sha1 = "10e53fd4d987e37190432e896bdaa62e8ea2c628",
)
maven_jar(
+ name = "google-api-client-gson",
+ artifact = "com.google.api-client:google-api-client-gson:2.2.0",
+ sha1 = "319d792c7df5164ba33f5741b642071915d8c046",
+ )
+ maven_jar(
name = "google-api-common",
artifact = "com.google.api:api-common:2.6.3",
sha1 = "b47c8a2c25005b94c4c43884e0a78bf965de17d8",
@@ -220,12 +225,27 @@
maven_jar(
name = "google-http-client",
artifact = "com.google.http-client:google-http-client:" + GOOGLE_HTTP_CLIENT_VER,
- sha1 = "2ef9413e65319ac448534b424522a2c48087d884",
+ sha1 = "a758b82e55a2f5f681e289c5ed384d3dbda6f3cd",
+ )
+ maven_jar(
+ name = "google-http-client-jackson",
+ artifact = "com.google.http-client:google-http-client-jackson2:" + GOOGLE_HTTP_CLIENT_VER,
+ sha1 = "689da86469d19a01c726c8c24477b95c8a834bbe",
+ )
+ maven_jar(
+ name = "google-code-gson",
+ artifact = "com.google.code.gson:gson:2.8.9",
+ sha1 = "8a432c1d6825781e21a02db2e2c33c5fde2833b9",
)
maven_jar(
name = "google-http-client-gson",
artifact = "com.google.http-client:google-http-client-gson:" + GOOGLE_HTTP_CLIENT_VER,
- sha1 = "06f000784f9813ee33f976e42822d98ffacf3dbd",
+ sha1 = "252e267acf720ef6333488740a696a1d5e204639",
+ )
+ maven_jar(
+ name = "google-api-client-jackson",
+ artifact = "com.google.api-client:google-api-client-jackson2:2.2.0",
+ sha1 = "a521bfbdc0cbca4796eb8cb1b7fd5bc4b9c4e7dd",
)
maven_jar(
name = "google-api-client-util",
@@ -233,16 +253,16 @@
sha1 = "5613058f449666061dbab2f824fb72b9de441b4d",
)
maven_jar(
- name = "google-api-client-gson",
- artifact = "com.google.api-client:google-api-client-gson:2.2.0",
- sha1 = "319d792c7df5164ba33f5741b642071915d8c046",
- )
- maven_jar(
name = "google-api-client-json",
artifact = "com.google.api.client:google-api-client-json:1.2.3-alpha",
sha1 = "96fc0eb531f79ca3d1cbb347e91b61df5743f051",
)
maven_jar(
+ name = "google-oauth-client-jetty",
+ artifact = "com.google.oauth-client:google-oauth-client-jetty:1.34.1",
+ sha1 = "a6aff2c1be148bac622e5048e20f536f71b3380d",
+ )
+ maven_jar(
name = "google-cloud-core-grpc",
artifact = "com.google.cloud:google-cloud-core-grpc:" + CLOUD_CORE_VER,
sha1 = "14fba1b12a8069aeb1bcd60006c76496ff766f6a",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Configuration.java
index e6653a3..960d358 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Configuration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/spannerrefdb/Configuration.java
@@ -14,17 +14,23 @@
package com.googlesource.gerrit.plugins.spannerrefdb;
+import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.spanner.DatabaseId;
import com.google.cloud.spanner.SpannerOptions;
import com.google.common.base.Strings;
+import com.google.common.flogger.FluentLogger;
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.inject.Inject;
import com.google.inject.Singleton;
+import java.io.FileInputStream;
+import java.io.IOException;
import org.eclipse.jgit.lib.Config;
@Singleton
class Configuration {
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
public static final String DATABASE_KEY = "database";
public static final String INSTANCE_KEY = "instance";
public static final String SECTION = "ref-database";
@@ -34,11 +40,22 @@
private SpannerOptions options;
@Inject
- Configuration(PluginConfigFactory configFactory, @PluginName String pluginName) {
+ Configuration(PluginConfigFactory configFactory, @PluginName String pluginName)
+ throws IOException {
Config cfg = configFactory.getGlobalPluginConfig(pluginName);
- this.spannerInstance = getString(cfg, SECTION, SUBSECTION, INSTANCE_KEY, "test-instance");
+ this.spannerInstance = getString(cfg, SECTION, SUBSECTION, INSTANCE_KEY, "spanner-instance");
this.spannerDatabase = getString(cfg, SECTION, SUBSECTION, DATABASE_KEY, "global-refdb");
- this.options = SpannerOptions.newBuilder().build();
+ boolean useEmulator = cfg.getBoolean(SECTION, "useEmulator", false);
+ if (useEmulator) {
+ this.options = SpannerOptions.newBuilder().build();
+ logger.atInfo().log(
+ "Using local Spanner emulator for global-refdb; Spanner credentials will not be read.");
+ } else {
+ String credentialsPath = getString(cfg, SECTION, null, "credentialsPath", null);
+ GoogleCredentials credentials =
+ GoogleCredentials.fromStream(new FileInputStream(credentialsPath));
+ this.options = SpannerOptions.newBuilder().setCredentials(credentials).build();
+ }
}
final String getSpannerInstanceName() {
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index b9409e0..61feccf 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -1,21 +1,29 @@
Configuration
=========================
-The plugin can be configured as usual in the gerrit.config. All configuration
-is optional, if no values are provided these will be the defaults.
+The plugin can be configured as usual in the gerrit.config.
+The credentialsPath is required when not using the Spanner emulator.
```
-[plugin "spanner-refdb"]
- gcpProject = test-project
- spannerInstance = test-instance
- spannerDatabase = global-refdb
+[ref-database "spanner"]
+ instance = spanner-instance
+ database = global-refdb
+ useEmulator = false
+ credentialsPath = /path/to/credentials.json
```
-`plugin.spanner-refdb.gcpProject`
-: Optional. The name of the google cloud platform project.
-
-`plugin.spanner-refdb.spannerInstance`
+`ref-database.spanner.instance`
: Optional. The name of the spanner instance.
+`Default: spanner-instance.`
-`plugin.spanner-refdb.spannerDatabase`
-: Optional. The name of the spanner database.
\ No newline at end of file
+`ref-database.spanner.database`
+: Optional. The name of the spanner database.
+`Default: global-refdb.`
+
+`ref-database.spanner.useEmulator`
+: Optional. Boolean, whether or not to use the [in-memory Cloud Spanner emulator](https://cloud.google.com/spanner/docs/emulator).
+`Default: false.`
+
+`ref-database.spanner.credentialsPath`
+: Required when not using the emulator. The path to Google cloud credentials.
+`Default: null.`
\ No newline at end of file
diff --git a/src/test/java/com/googlesource/gerrit/plugins/spannerrefdb/SpannerEmulatorContainer.java b/src/test/java/com/googlesource/gerrit/plugins/spannerrefdb/SpannerEmulatorContainer.java
index a331e2c..203da39 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/spannerrefdb/SpannerEmulatorContainer.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/spannerrefdb/SpannerEmulatorContainer.java
@@ -156,6 +156,7 @@
private Configuration createEmulatorConfiguration() {
Config refDbConfig = new Config();
+ refDbConfig.setBoolean(Configuration.SECTION, null, "useEmulator", true);
refDbConfig.setString(SECTION, SUBSECTION, INSTANCE_KEY, SPANNER_INSTANCE_ID);
refDbConfig.setString(SECTION, SUBSECTION, DATABASE_KEY, SPANNER_DATABASE_ID);