From f83c08b21cfca7063d63c96d0e5c892ff609be7a Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Tue, 12 Aug 2025 23:03:14 +0000 Subject: [PATCH 1/3] feat(bigtable): Add support for creating instance with tags --- .../v2/models/CreateInstanceRequest.java | 16 +++++++ .../bigtable/admin/v2/models/Instance.java | 6 +++ .../v2/BigtableInstanceAdminClientTests.java | 3 +- .../v2/models/CreateClusterRequestTest.java | 2 + .../admin/v2/models/InstanceTest.java | 44 ++++++++++--------- 5 files changed, 49 insertions(+), 22 deletions(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java index 685e52d555b1..a94c1e8251fd 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java @@ -118,6 +118,22 @@ public CreateInstanceRequest addLabel(@Nonnull String key, @Nonnull String value return this; } + /** + * Adds a tag to the instance. + * + *

Tags are a way to organize and govern resources across Google Cloud. Unlike labels, + * Tags are standalone resources created and managed through the Resource Manager API. + * + * @see For more details + */ + @SuppressWarnings("WeakerAccess") + public CreateInstanceRequest addTag(@Nonnull String key, @Nonnull String value) { + Preconditions.checkNotNull(key, "Key can't be null"); + Preconditions.checkNotNull(value, "Value can't be null"); + builder.getInstanceBuilder().putTags(key, value); + return this; + } + /** * Adds a cluster to the instance request with manual scaling enabled. * diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Instance.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Instance.java index c3a0c43bcaf9..17d6e890f1d4 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Instance.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Instance.java @@ -150,6 +150,12 @@ public String getDisplayName() { return proto.getDisplayName(); } + /** Gets the instance's tags. */ + @SuppressWarnings("WeakerAccess") + public Map getTags() { + return proto.getTagsMap(); + } + /** Gets the instance's current type. Can be DEVELOPMENT or PRODUCTION. */ @SuppressWarnings("WeakerAccess") public Type getType() { diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClientTests.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClientTests.java index 92174437908e..23cfeb1fbe27 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClientTests.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/BigtableInstanceAdminClientTests.java @@ -334,7 +334,8 @@ public void testCreateInstance() { .setInstance( com.google.bigtable.admin.v2.Instance.newBuilder() .setType(com.google.bigtable.admin.v2.Instance.Type.DEVELOPMENT) - .setDisplayName(INSTANCE_ID)) + .setDisplayName(INSTANCE_ID) + .putTags("tagKeys/123", "tagValues/456")) .putClusters( "cluster1", com.google.bigtable.admin.v2.Cluster.newBuilder() diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/CreateClusterRequestTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/CreateClusterRequestTest.java index 566641039a3f..fe2894834705 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/CreateClusterRequestTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/CreateClusterRequestTest.java @@ -128,6 +128,7 @@ public void testOptionalFields() { .setDisplayName("custom display name") .addLabel("my label", "with some value") .addLabel("my other label", "with some value") + .addTag("tagKeys/123", "tagValues/456") .setType(Instance.Type.DEVELOPMENT) .addCluster("cluster1", "us-east1-c", 1, StorageType.SSD); @@ -142,6 +143,7 @@ public void testOptionalFields() { .setDisplayName("custom display name") .putLabels("my label", "with some value") .putLabels("my other label", "with some value") + .putTags("tagKeys/123", "tagValues/456") .setType(com.google.bigtable.admin.v2.Instance.Type.DEVELOPMENT)) .putClusters( "cluster1", diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/InstanceTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/InstanceTest.java index 78fdf15b03b3..7bd3d437a833 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/InstanceTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/InstanceTest.java @@ -28,15 +28,16 @@ public class InstanceTest { @Test public void testFromProto() { - com.google.bigtable.admin.v2.Instance proto = - com.google.bigtable.admin.v2.Instance.newBuilder() - .setName("projects/my-project/instances/my-instance") - .setDisplayName("my display name") - .setType(com.google.bigtable.admin.v2.Instance.Type.PRODUCTION) - .setState(com.google.bigtable.admin.v2.Instance.State.READY) - .putLabels("label1", "value1") - .putLabels("label2", "value2") - .build(); + com.google.bigtable.admin.v2.Instance proto = com.google.bigtable.admin.v2.Instance.newBuilder() + .setName("projects/my-project/instances/my-instance") + .setDisplayName("my display name") + .setType(com.google.bigtable.admin.v2.Instance.Type.PRODUCTION) + .setState(com.google.bigtable.admin.v2.Instance.State.READY) + .putLabels("label1", "value1") + .putLabels("label2", "value2") + .putTags("tagKeys/123", "tagValues/456") + .putTags("tagKeys/234", "tagValues/567") + .build(); Instance result = Instance.fromProto(proto); @@ -48,18 +49,19 @@ public void testFromProto() { .containsExactly( "label1", "value1", "label2", "value2"); + assertThat(result.getTags()).containsExactly("tagKeys/123", "tagValues/456", "tagKeys/234", "tagValues/567"); } @Test public void testRequiresName() { - com.google.bigtable.admin.v2.Instance proto = - com.google.bigtable.admin.v2.Instance.newBuilder() - .setDisplayName("my display name") - .setType(com.google.bigtable.admin.v2.Instance.Type.PRODUCTION) - .setState(com.google.bigtable.admin.v2.Instance.State.READY) - .putLabels("label1", "value1") - .putLabels("label2", "value2") - .build(); + com.google.bigtable.admin.v2.Instance proto = com.google.bigtable.admin.v2.Instance.newBuilder() + .setDisplayName("my display name") + .setType(com.google.bigtable.admin.v2.Instance.Type.PRODUCTION) + .setState(com.google.bigtable.admin.v2.Instance.State.READY) + .putLabels("label1", "value1") + .putLabels("label2", "value2") + .putTags("tagKeys/123", "tagValues/456") + .build(); Exception actualException = null; @@ -74,8 +76,8 @@ public void testRequiresName() { @Test public void testTypeEnumUpToDate() { - List validProtoValues = - Lists.newArrayList(com.google.bigtable.admin.v2.Instance.Type.values()); + List validProtoValues = Lists + .newArrayList(com.google.bigtable.admin.v2.Instance.Type.values()); // TYPE_UNSPECIFIED is not surfaced validProtoValues.remove(com.google.bigtable.admin.v2.Instance.Type.TYPE_UNSPECIFIED); @@ -100,8 +102,8 @@ public void testTypeEnumUpToDate() { @Test public void testStateEnumUpToDate() { - List validProtoValues = - Lists.newArrayList(com.google.bigtable.admin.v2.Instance.State.values()); + List validProtoValues = Lists + .newArrayList(com.google.bigtable.admin.v2.Instance.State.values()); List validModelValues = Lists.newArrayList(Instance.State.values()); From 0c267b6bc168f9c0c2b5fd6b0e3edca6487974f1 Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Tue, 12 Aug 2025 23:06:46 +0000 Subject: [PATCH 2/3] Fix comment --- .../cloud/bigtable/admin/v2/models/CreateInstanceRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java index a94c1e8251fd..ca80a3f99d6b 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java @@ -124,7 +124,7 @@ public CreateInstanceRequest addLabel(@Nonnull String key, @Nonnull String value *

Tags are a way to organize and govern resources across Google Cloud. Unlike labels, * Tags are standalone resources created and managed through the Resource Manager API. * - * @see For more details + * @see For more details */ @SuppressWarnings("WeakerAccess") public CreateInstanceRequest addTag(@Nonnull String key, @Nonnull String value) { From 4307f41ea1d386aea65d3dc896285969d05f0b22 Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Wed, 13 Aug 2025 03:51:15 +0000 Subject: [PATCH 3/3] Fix formatting --- .../v2/models/CreateInstanceRequest.java | 4 +- .../bigtable/admin/v2/models/Instance.java | 2 +- .../admin/v2/models/InstanceTest.java | 49 ++++++++++--------- 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java index ca80a3f99d6b..69c75f901172 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateInstanceRequest.java @@ -121,8 +121,8 @@ public CreateInstanceRequest addLabel(@Nonnull String key, @Nonnull String value /** * Adds a tag to the instance. * - *

Tags are a way to organize and govern resources across Google Cloud. Unlike labels, - * Tags are standalone resources created and managed through the Resource Manager API. + *

Tags are a way to organize and govern resources across Google Cloud. Unlike labels, Tags are + * standalone resources created and managed through the Resource Manager API. * * @see For more details */ diff --git a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Instance.java b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Instance.java index 17d6e890f1d4..df163b0e0daf 100644 --- a/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Instance.java +++ b/google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/Instance.java @@ -152,7 +152,7 @@ public String getDisplayName() { /** Gets the instance's tags. */ @SuppressWarnings("WeakerAccess") - public Map getTags() { + public Map getTags() { return proto.getTagsMap(); } diff --git a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/InstanceTest.java b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/InstanceTest.java index 7bd3d437a833..35b776fbe454 100644 --- a/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/InstanceTest.java +++ b/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/InstanceTest.java @@ -28,16 +28,17 @@ public class InstanceTest { @Test public void testFromProto() { - com.google.bigtable.admin.v2.Instance proto = com.google.bigtable.admin.v2.Instance.newBuilder() - .setName("projects/my-project/instances/my-instance") - .setDisplayName("my display name") - .setType(com.google.bigtable.admin.v2.Instance.Type.PRODUCTION) - .setState(com.google.bigtable.admin.v2.Instance.State.READY) - .putLabels("label1", "value1") - .putLabels("label2", "value2") - .putTags("tagKeys/123", "tagValues/456") - .putTags("tagKeys/234", "tagValues/567") - .build(); + com.google.bigtable.admin.v2.Instance proto = + com.google.bigtable.admin.v2.Instance.newBuilder() + .setName("projects/my-project/instances/my-instance") + .setDisplayName("my display name") + .setType(com.google.bigtable.admin.v2.Instance.Type.PRODUCTION) + .setState(com.google.bigtable.admin.v2.Instance.State.READY) + .putLabels("label1", "value1") + .putLabels("label2", "value2") + .putTags("tagKeys/123", "tagValues/456") + .putTags("tagKeys/234", "tagValues/567") + .build(); Instance result = Instance.fromProto(proto); @@ -49,19 +50,21 @@ public void testFromProto() { .containsExactly( "label1", "value1", "label2", "value2"); - assertThat(result.getTags()).containsExactly("tagKeys/123", "tagValues/456", "tagKeys/234", "tagValues/567"); + assertThat(result.getTags()) + .containsExactly("tagKeys/123", "tagValues/456", "tagKeys/234", "tagValues/567"); } @Test public void testRequiresName() { - com.google.bigtable.admin.v2.Instance proto = com.google.bigtable.admin.v2.Instance.newBuilder() - .setDisplayName("my display name") - .setType(com.google.bigtable.admin.v2.Instance.Type.PRODUCTION) - .setState(com.google.bigtable.admin.v2.Instance.State.READY) - .putLabels("label1", "value1") - .putLabels("label2", "value2") - .putTags("tagKeys/123", "tagValues/456") - .build(); + com.google.bigtable.admin.v2.Instance proto = + com.google.bigtable.admin.v2.Instance.newBuilder() + .setDisplayName("my display name") + .setType(com.google.bigtable.admin.v2.Instance.Type.PRODUCTION) + .setState(com.google.bigtable.admin.v2.Instance.State.READY) + .putLabels("label1", "value1") + .putLabels("label2", "value2") + .putTags("tagKeys/123", "tagValues/456") + .build(); Exception actualException = null; @@ -76,8 +79,8 @@ public void testRequiresName() { @Test public void testTypeEnumUpToDate() { - List validProtoValues = Lists - .newArrayList(com.google.bigtable.admin.v2.Instance.Type.values()); + List validProtoValues = + Lists.newArrayList(com.google.bigtable.admin.v2.Instance.Type.values()); // TYPE_UNSPECIFIED is not surfaced validProtoValues.remove(com.google.bigtable.admin.v2.Instance.Type.TYPE_UNSPECIFIED); @@ -102,8 +105,8 @@ public void testTypeEnumUpToDate() { @Test public void testStateEnumUpToDate() { - List validProtoValues = Lists - .newArrayList(com.google.bigtable.admin.v2.Instance.State.values()); + List validProtoValues = + Lists.newArrayList(com.google.bigtable.admin.v2.Instance.State.values()); List validModelValues = Lists.newArrayList(Instance.State.values());