diff --git a/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClient.java b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClient.java new file mode 100644 index 000000000000..b2a2f741126d --- /dev/null +++ b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClient.java @@ -0,0 +1,108 @@ +/* + * Copyright 2018 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 + * + * https://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.google.cloud.bigtable.admin.v2; + +import com.google.bigtable.admin.v2.ProjectName; +import com.google.cloud.bigtable.admin.v2.stub.BigtableInstanceAdminStub; +import java.io.IOException; +import javax.annotation.Nonnull; + +/** + * Client for creating, configuring and delete Cloud Bigtable instances (including AppProfiles and + * Clusters). + * + *
See the individual methods for example code. + * + *
{@code
+ * try(BigtableInstanceAdminClient client = BigtableInstanceAdminClient.create(ProjectName.of("my-project"))) {
+ * CreateInstanceRequest request = CreateInstanceRequest.of("my-instance")
+ * .addFamily("cf1")
+ * .addFamily("cf2", GCRULES.maxVersions(10))
+ * .addSplit(ByteString.copyFromUtf8("b"))
+ * .addSplit(ByteString.copyFromUtf8("q"));
+ *
+ * client.createInstance(request);
+ * }
+ * }
+ *
+ * Note: close() needs to be called on the client object to clean up resources such as threads. + * In the example above, try-with-resources is used, which automatically calls close(). + * + *
This class can be customized by passing in a custom instance of BigtableInstanceAdminSettings + * to create(). For example: + * + *
To customize credentials: + * + *
{@code
+ * BigtableInstanceAdminSettings settings = BigtableInstanceAdminSettings.newBuilder()
+ * .setProjectName(ProjectName.of("[PROJECT]"))
+ * .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))
+ * .build();
+ *
+ * BigtableInstanceAdminClient client = BigtableInstanceAdminClient.create(settings);
+ * }
+ *
+ * To customize the endpoint:
+ *
+ * {@code
+ * BigtableInstanceAdminSettings settings = BigtableInstanceAdminSettings.newBuilder()
+ * .setProjectName(ProjectName.of("[PROJECT]"))
+ * .setEndpoint(myEndpoint)
+ * .build();
+ *
+ * BigtableInstanceAdminClient client = BigtableInstanceAdminClient.create(settings);
+ * }
+ */
+public final class BigtableInstanceAdminClient implements AutoCloseable {
+ private final ProjectName projectName;
+ private final BigtableInstanceAdminStub stub;
+
+ /** Constructs an instance of BigtableInstanceAdminClient with the given ProjectName. */
+ public static BigtableInstanceAdminClient create(@Nonnull ProjectName projectName)
+ throws IOException {
+ return create(BigtableInstanceAdminSettings.newBuilder().setProjectName(projectName).build());
+ }
+
+ /** Constructs an instance of BigtableInstanceAdminClient with the given settings. */
+ public static BigtableInstanceAdminClient create(@Nonnull BigtableInstanceAdminSettings settings)
+ throws IOException {
+ return create(settings.getProjectName(), settings.getStubSettings().createStub());
+ }
+
+ /** Constructs an instance of BigtableInstanceAdminClient with the given Projectname and stub. */
+ public static BigtableInstanceAdminClient create(@Nonnull ProjectName projectName,
+ @Nonnull BigtableInstanceAdminStub stub) {
+ return new BigtableInstanceAdminClient(projectName, stub);
+ }
+
+
+ private BigtableInstanceAdminClient(
+ @Nonnull ProjectName projectName, @Nonnull BigtableInstanceAdminStub stub) {
+ this.projectName = projectName;
+ this.stub = stub;
+ }
+
+ /** Gets the ProjectName this client is associated with. */
+ public ProjectName getProjectName() {
+ return projectName;
+ }
+
+ /** Closes the client and frees all resources associated with it (like thread pools) */
+ @Override
+ public void close() {
+ stub.close();
+ }
+}
diff --git a/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettings.java b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettings.java
new file mode 100644
index 000000000000..cd6db65b97b4
--- /dev/null
+++ b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettings.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2018 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
+ *
+ * https://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.google.cloud.bigtable.admin.v2;
+
+import com.google.bigtable.admin.v2.ProjectName;
+import com.google.cloud.bigtable.admin.v2.stub.BigtableInstanceAdminStubSettings;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Verify;
+import java.io.IOException;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+/**
+ * Settings class to configure an instance of {@link BigtableInstanceAdminClient}.
+ *
+ * It must be configured with a {@link ProjectName} and can be used to change default RPC settings. + * + *
Example usage: + * + *
{@code
+ * BigtableInstanceAdminSettings.Builder settingsBuilder = BigtableInstanceAdminSettings.newBuilder()
+ * .setProjectName(ProjectName.of("my-project"));
+ *
+ * settingsBuilder.stubSettings().createInstanceSettings()
+ * .setRetrySettings(
+ * RetrySettings.newBuilder()
+ * .setTotalTimeout(Duration.ofMinutes(15))
+ * .build());
+ *
+ * BigtableInstanceAdminSettings settings = settingsBuilder.build();
+ * }
+ */
+public final class BigtableInstanceAdminSettings {
+ private final ProjectName projectName;
+ private final BigtableInstanceAdminStubSettings stubSettings;
+
+ private BigtableInstanceAdminSettings(Builder builder) throws IOException {
+ Preconditions.checkNotNull(builder.projectName, "ProjectName must be set");
+ Verify.verifyNotNull(builder.stubSettings, "stubSettings should never be null");
+
+ this.projectName = builder.projectName;
+ this.stubSettings = builder.stubSettings.build();
+ }
+
+ /** Gets the anme of the project whose instances the client will manager. */
+ @Nonnull
+ public ProjectName getProjectName() {
+ return projectName;
+ }
+
+ /** Gets the underlying RPC settings. */
+ @Nonnull
+ public BigtableInstanceAdminStubSettings getStubSettings() {
+ return stubSettings;
+ }
+
+ /** Returns a builder containing all the values of this settings class. */
+ public Builder toBuilder() {
+ return new Builder(this);
+ }
+
+ /** Returns a new builder for this class. */
+ public static Builder newBuilder() {
+ return new Builder();
+ }
+
+
+ /** Builder for BigtableInstanceAdminSettings. */
+ public static final class Builder {
+ @Nullable
+ private ProjectName projectName;
+ private final BigtableInstanceAdminStubSettings.Builder stubSettings;
+
+ private Builder() {
+ stubSettings = BigtableInstanceAdminStubSettings.newBuilder();
+ }
+
+ private Builder(BigtableInstanceAdminSettings settings) {
+ this.projectName = settings.projectName;
+ this.stubSettings = settings.stubSettings.toBuilder();
+ }
+
+ /** Sets the name of instance whose tables the client will manage. */
+ public Builder setProjectName(@Nonnull ProjectName projectName) {
+ Preconditions.checkNotNull(projectName);
+ this.projectName = projectName;
+ return this;
+ }
+
+ /** Gets the name of the project whose instances the client will manage. */
+ @Nullable
+ public ProjectName getProjectName() {
+ return projectName;
+ }
+
+ /**
+ * Returns the builder for the settings used for all RPCs.
+ *
+ * This is meant for advanced usage. The default RPC settings are set to their recommended + * values. + */ + public BigtableInstanceAdminStubSettings.Builder stubSettings() { + return stubSettings; + } + + /** Builds an instance of the settings. */ + public BigtableInstanceAdminSettings build() throws IOException { + return new BigtableInstanceAdminSettings(this); + } + } +} diff --git a/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClient.java b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClient.java index a0d2f911aa7e..19842ba93173 100644 --- a/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClient.java +++ b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminClient.java @@ -92,7 +92,7 @@ * BigtableTableAdminClient client = BigtableTableAdminClient.create(tableAdminSettings); * } */ -public class BigtableTableAdminClient implements AutoCloseable { +public final class BigtableTableAdminClient implements AutoCloseable { private final BigtableTableAdminStub stub; private final InstanceName instanceName; diff --git a/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminSettings.java b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminSettings.java index 16a296ef0eee..243cdf74e5e6 100644 --- a/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminSettings.java +++ b/google-cloud-clients/google-cloud-bigtable-admin/src/main/java/com/google/cloud/bigtable/admin/v2/BigtableTableAdminSettings.java @@ -26,7 +26,7 @@ /** * Settings class to configure an instance of {@link BigtableTableAdminClient}. * - *
It must be configured with an {@link InstanceName} and be used to change default RPC settings. + *
It must be configured with an {@link InstanceName} and can be used to change default RPC settings. * *
Example usage: * diff --git a/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClientTest.java b/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClientTest.java new file mode 100644 index 000000000000..d76193b7afb5 --- /dev/null +++ b/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClientTest.java @@ -0,0 +1,51 @@ +/* + * Copyright 2018 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 + * + * https://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.google.cloud.bigtable.admin.v2; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.bigtable.admin.v2.ProjectName; +import com.google.cloud.bigtable.admin.v2.stub.BigtableInstanceAdminStub; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class BigtableInstanceAdminClientTest { + private BigtableInstanceAdminClient adminClient; + @Mock + private BigtableInstanceAdminStub mockStub; + + @Before + public void setUp() { + adminClient = BigtableInstanceAdminClient + .create(ProjectName.of("[PROJECT]"), mockStub); + } + + @Test + public void testProjectName() { + assertThat(adminClient.getProjectName()).isEqualTo(ProjectName.of("[PROJECT]")); + } + + @Test + public void testClose() { + adminClient.close(); + Mockito.verify(mockStub).close(); + } +} diff --git a/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettingsTest.java b/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettingsTest.java new file mode 100644 index 000000000000..fbd95ab6a0a3 --- /dev/null +++ b/google-cloud-clients/google-cloud-bigtable-admin/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminSettingsTest.java @@ -0,0 +1,71 @@ +/* + * Copyright 2018 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 + * + * https://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.google.cloud.bigtable.admin.v2; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.api.gax.rpc.StatusCode.Code; +import com.google.bigtable.admin.v2.ProjectName; +import com.google.cloud.bigtable.admin.v2.BigtableInstanceAdminSettings.Builder; +import java.io.IOException; +import org.junit.Test; + +public class BigtableInstanceAdminSettingsTest { + @Test + public void testProjectName() throws Exception { + ProjectName projectName = ProjectName.of("my-project"); + Builder builder = BigtableInstanceAdminSettings.newBuilder() + .setProjectName(projectName); + + assertThat(builder.getProjectName()).isEqualTo(projectName); + assertThat(builder.build().getProjectName()).isEqualTo(projectName); + assertThat(builder.build().toBuilder().getProjectName()).isEqualTo(projectName); + } + + @Test + public void testMissingProjectName() { + Exception actualException = null; + + Builder settingsBuilder = BigtableInstanceAdminSettings.newBuilder(); + assertThat(settingsBuilder.getProjectName()).isNull(); + + try { + settingsBuilder.build(); + } catch (Exception e) { + actualException = e; + } + + assertThat(actualException).isInstanceOf(NullPointerException.class); + } + + @Test + public void testStubSettings() throws IOException { + ProjectName projectName = ProjectName.of("my-project"); + + BigtableInstanceAdminSettings.Builder builder = BigtableInstanceAdminSettings.newBuilder() + .setProjectName(projectName); + + builder.stubSettings().createInstanceSettings() + .setRetryableCodes(Code.INVALID_ARGUMENT); + + assertThat(builder.build().getStubSettings().createInstanceSettings().getRetryableCodes()) + .containsExactly(Code.INVALID_ARGUMENT); + + assertThat(builder.build().toBuilder().build().getStubSettings().createInstanceSettings() + .getRetryableCodes()) + .containsExactly(Code.INVALID_ARGUMENT); + } +}