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); + } +}