Skip to content

Commit 3b1886b

Browse files
feat: admin API changes for databoost (#2181)
* feat: add Data Boost configurations to admin API PiperOrigin-RevId: 617925342 Source-Link: googleapis/googleapis@6f289d7 Source-Link: googleapis/googleapis-gen@92da6d5 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiOTJkYTZkNWQ0MzVhZjUzM2Y3MjZhOTdiY2ZmZjNjNzE3ODMyYzg3NyJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * feat: admin API changes for databoost * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * add a integration test * update integration test --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent 83a196f commit 3b1886b

File tree

7 files changed

+263
-1
lines changed

7 files changed

+263
-1
lines changed

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/AppProfile.java

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package com.google.cloud.bigtable.admin.v2.models;
1717

1818
import com.google.api.core.InternalApi;
19+
import com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly;
1920
import com.google.bigtable.admin.v2.AppProfile.MultiClusterRoutingUseAny;
2021
import com.google.bigtable.admin.v2.AppProfile.Priority;
2122
import com.google.bigtable.admin.v2.AppProfile.StandardIsolation;
@@ -81,6 +82,8 @@ public RoutingPolicy getPolicy() {
8182
public IsolationPolicy getIsolationPolicy() {
8283
if (proto.hasStandardIsolation()) {
8384
return new StandardIsolationPolicy(proto.getStandardIsolation());
85+
} else if (proto.hasDataBoostIsolationReadOnly()) {
86+
return new DataBoostIsolationReadOnlyPolicy(proto.getDataBoostIsolationReadOnly());
8487
} else {
8588
// Should never happen because the constructor verifies that one must exist.
8689
throw new IllegalStateException();
@@ -409,4 +412,105 @@ public int hashCode() {
409412
return Objects.hashCode(proto);
410413
}
411414
}
415+
416+
/** Compute Billing Owner specifies how usage should be accounted when using Data Boost. */
417+
public static enum ComputeBillingOwner {
418+
UNSPECIFIED(DataBoostIsolationReadOnly.ComputeBillingOwner.COMPUTE_BILLING_OWNER_UNSPECIFIED),
419+
HOST_PAYS(DataBoostIsolationReadOnly.ComputeBillingOwner.HOST_PAYS),
420+
UNRECOGNIZED(DataBoostIsolationReadOnly.ComputeBillingOwner.UNRECOGNIZED);
421+
422+
private final com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly
423+
.ComputeBillingOwner
424+
proto;
425+
426+
/**
427+
* Wraps the protobuf. This method is considered an internal implementation detail and not meant
428+
* to be used by applications.
429+
*/
430+
@InternalApi
431+
public static ComputeBillingOwner fromProto(
432+
com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly.ComputeBillingOwner
433+
proto) {
434+
Preconditions.checkNotNull(proto);
435+
436+
for (ComputeBillingOwner owner : values()) {
437+
if (owner.proto.equals(proto)) {
438+
return owner;
439+
}
440+
}
441+
442+
return UNRECOGNIZED;
443+
}
444+
445+
/**
446+
* Creates the request protobuf. This method is considered an internal implementation detail and
447+
* not meant to be used by applications.
448+
*/
449+
@InternalApi
450+
public DataBoostIsolationReadOnly.ComputeBillingOwner toProto() {
451+
return proto;
452+
}
453+
454+
ComputeBillingOwner(DataBoostIsolationReadOnly.ComputeBillingOwner proto) {
455+
this.proto = proto;
456+
}
457+
}
458+
459+
/**
460+
* A Data Boost Read Only {@link IsolationPolicy} for running high-throughput read traffic on your
461+
* Bigtable data without affecting application traffic. Data Boost App Profile needs to be created
462+
* with a ComputeBillingOwner which specifies how usage should be accounted when using Data Boost.
463+
*/
464+
public static class DataBoostIsolationReadOnlyPolicy implements IsolationPolicy {
465+
private final DataBoostIsolationReadOnly proto;
466+
467+
DataBoostIsolationReadOnlyPolicy(DataBoostIsolationReadOnly proto) {
468+
this.proto = proto;
469+
}
470+
471+
/**
472+
* Creates a new instance of {@link DataBoostIsolationReadOnlyPolicy} with specified {@link
473+
* ComputeBillingOwner}.
474+
*/
475+
public static DataBoostIsolationReadOnlyPolicy of(ComputeBillingOwner billingOwner) {
476+
return new DataBoostIsolationReadOnlyPolicy(
477+
DataBoostIsolationReadOnly.newBuilder()
478+
.setComputeBillingOwner(billingOwner.toProto())
479+
.build());
480+
}
481+
482+
/**
483+
* Gets the {@link ComputeBillingOwner} on the current {@link DataBoostIsolationReadOnlyPolicy}
484+
* instance.
485+
*/
486+
public ComputeBillingOwner getComputeBillingOwner() {
487+
return ComputeBillingOwner.fromProto(proto.getComputeBillingOwner());
488+
}
489+
490+
/**
491+
* Creates the request protobuf. This method is considered an internal implementation detail and
492+
* not meant to be used by applications.
493+
*/
494+
@InternalApi
495+
public DataBoostIsolationReadOnly toProto() {
496+
return proto;
497+
}
498+
499+
@Override
500+
public boolean equals(Object o) {
501+
if (this == o) {
502+
return true;
503+
}
504+
if (o == null || getClass() != o.getClass()) {
505+
return false;
506+
}
507+
DataBoostIsolationReadOnlyPolicy that = (DataBoostIsolationReadOnlyPolicy) o;
508+
return Objects.equal(proto, that.proto);
509+
}
510+
511+
@Override
512+
public int hashCode() {
513+
return Objects.hashCode(proto);
514+
}
515+
}
412516
}

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/CreateAppProfileRequest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,15 @@ public CreateAppProfileRequest setRoutingPolicy(RoutingPolicy routingPolicy) {
9797
/** Sets the isolation policy for all read/write requests that use this app profile. */
9898
public CreateAppProfileRequest setIsolationPolicy(IsolationPolicy isolationPolicy) {
9999
Preconditions.checkNotNull(isolationPolicy);
100-
101100
if (isolationPolicy instanceof StandardIsolationPolicy) {
102101
proto
103102
.getAppProfileBuilder()
104103
.setStandardIsolation(((StandardIsolationPolicy) isolationPolicy).toProto());
104+
} else if (isolationPolicy instanceof AppProfile.DataBoostIsolationReadOnlyPolicy) {
105+
proto
106+
.getAppProfileBuilder()
107+
.setDataBoostIsolationReadOnly(
108+
((AppProfile.DataBoostIsolationReadOnlyPolicy) isolationPolicy).toProto());
105109
} else {
106110
throw new IllegalArgumentException("Unknown policy type: " + isolationPolicy);
107111
}

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/admin/v2/models/UpdateAppProfileRequest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.google.api.core.InternalApi;
1919
import com.google.cloud.bigtable.admin.v2.internal.NameUtil;
20+
import com.google.cloud.bigtable.admin.v2.models.AppProfile.DataBoostIsolationReadOnlyPolicy;
2021
import com.google.cloud.bigtable.admin.v2.models.AppProfile.IsolationPolicy;
2122
import com.google.cloud.bigtable.admin.v2.models.AppProfile.MultiClusterRoutingPolicy;
2223
import com.google.cloud.bigtable.admin.v2.models.AppProfile.RoutingPolicy;
@@ -132,6 +133,13 @@ public UpdateAppProfileRequest setIsolationPolicy(@Nonnull IsolationPolicy isola
132133
.getAppProfileBuilder()
133134
.setStandardIsolation(((StandardIsolationPolicy) isolationPolicy).toProto());
134135
updateFieldMask(com.google.bigtable.admin.v2.AppProfile.STANDARD_ISOLATION_FIELD_NUMBER);
136+
} else if (isolationPolicy instanceof DataBoostIsolationReadOnlyPolicy) {
137+
proto
138+
.getAppProfileBuilder()
139+
.setDataBoostIsolationReadOnly(
140+
((DataBoostIsolationReadOnlyPolicy) isolationPolicy).toProto());
141+
updateFieldMask(
142+
com.google.bigtable.admin.v2.AppProfile.DATA_BOOST_ISOLATION_READ_ONLY_FIELD_NUMBER);
135143
} else {
136144
throw new IllegalArgumentException("Unknown policy type: " + isolationPolicy);
137145
}

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/it/BigtableInstanceAdminClientIT.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,43 @@ public void appProfileTestPriority() {
242242
}
243243
}
244244

245+
@Test
246+
public void appProfileTestDataBoost() {
247+
String newInstanceId = prefixGenerator.newPrefix();
248+
String newClusterId = newInstanceId + "-c1";
249+
250+
client.createInstance(
251+
CreateInstanceRequest.of(newInstanceId)
252+
.addCluster(newClusterId, testEnvRule.env().getPrimaryZone(), 1, StorageType.SSD)
253+
.setDisplayName("Priority-Instance-Test")
254+
.addLabel("state", "readytodelete")
255+
.setType(Type.PRODUCTION));
256+
257+
try {
258+
assertThat(client.exists(newInstanceId)).isTrue();
259+
260+
String testAppProfile = prefixGenerator.newPrefix();
261+
262+
CreateAppProfileRequest request =
263+
CreateAppProfileRequest.of(newInstanceId, testAppProfile)
264+
.setRoutingPolicy(AppProfile.SingleClusterRoutingPolicy.of(newClusterId))
265+
.setIsolationPolicy(
266+
AppProfile.DataBoostIsolationReadOnlyPolicy.of(
267+
AppProfile.ComputeBillingOwner.HOST_PAYS))
268+
.setDescription("databoost app profile");
269+
270+
AppProfile newlyCreateAppProfile = client.createAppProfile(request);
271+
AppProfile.ComputeBillingOwner computeBillingOwner =
272+
((AppProfile.DataBoostIsolationReadOnlyPolicy) newlyCreateAppProfile.getIsolationPolicy())
273+
.getComputeBillingOwner();
274+
assertThat(computeBillingOwner).isEqualTo(AppProfile.ComputeBillingOwner.HOST_PAYS);
275+
} finally {
276+
if (client.exists(newInstanceId)) {
277+
client.deleteInstance(newInstanceId);
278+
}
279+
}
280+
}
281+
245282
@Test
246283
public void iamUpdateTest() {
247284
Policy policy = client.getIamPolicy(instanceId);

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/AppProfileTest.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,61 @@ public void testHashCode() {
234234
assertThat(updateAppProfileRequest.hashCode())
235235
.isNotEqualTo(updateAppProfileRequest3.hashCode());
236236
}
237+
238+
@Test
239+
public void testFromProtoWithDataBoostIsolation() {
240+
AppProfile producer =
241+
AppProfile.fromProto(
242+
com.google.bigtable.admin.v2.AppProfile.newBuilder()
243+
.setName(AppProfileName.of("my-project", "my-instance", "my-profile").toString())
244+
.setDescription("my description")
245+
.setSingleClusterRouting(
246+
SingleClusterRouting.newBuilder()
247+
.setClusterId("my-cluster")
248+
.setAllowTransactionalWrites(true)
249+
.build())
250+
.setDataBoostIsolationReadOnly(
251+
com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly.newBuilder()
252+
.setComputeBillingOwner(
253+
com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly
254+
.ComputeBillingOwner.HOST_PAYS))
255+
.setEtag("my-etag")
256+
.build());
257+
258+
assertThat(producer.getInstanceId()).isEqualTo("my-instance");
259+
assertThat(producer.getId()).isEqualTo("my-profile");
260+
assertThat(producer.getDescription()).isEqualTo("my description");
261+
assertThat(producer.getPolicy()).isEqualTo(SingleClusterRoutingPolicy.of("my-cluster", true));
262+
assertThat(producer.getIsolationPolicy())
263+
.isEqualTo(
264+
AppProfile.DataBoostIsolationReadOnlyPolicy.of(
265+
AppProfile.ComputeBillingOwner.HOST_PAYS));
266+
267+
AppProfile consumer =
268+
AppProfile.fromProto(
269+
com.google.bigtable.admin.v2.AppProfile.newBuilder()
270+
.setName(AppProfileName.of("my-project", "my-instance", "my-profile").toString())
271+
.setDescription("my description")
272+
.setSingleClusterRouting(
273+
SingleClusterRouting.newBuilder()
274+
.setClusterId("my-cluster")
275+
.setAllowTransactionalWrites(true)
276+
.build())
277+
.setDataBoostIsolationReadOnly(
278+
com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly.newBuilder()
279+
.setComputeBillingOwner(
280+
com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly
281+
.ComputeBillingOwner.COMPUTE_BILLING_OWNER_UNSPECIFIED))
282+
.setEtag("my-etag")
283+
.build());
284+
285+
assertThat(consumer.getInstanceId()).isEqualTo("my-instance");
286+
assertThat(consumer.getId()).isEqualTo("my-profile");
287+
assertThat(consumer.getDescription()).isEqualTo("my description");
288+
assertThat(consumer.getPolicy()).isEqualTo(SingleClusterRoutingPolicy.of("my-cluster", true));
289+
assertThat(consumer.getIsolationPolicy())
290+
.isEqualTo(
291+
AppProfile.DataBoostIsolationReadOnlyPolicy.of(
292+
AppProfile.ComputeBillingOwner.UNSPECIFIED));
293+
}
237294
}

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/CreateAppProfileRequestTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static com.google.common.truth.Truth.assertThat;
1919

20+
import com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly;
2021
import com.google.bigtable.admin.v2.AppProfile.MultiClusterRoutingUseAny;
2122
import com.google.bigtable.admin.v2.AppProfile.SingleClusterRouting;
2223
import com.google.bigtable.admin.v2.AppProfile.StandardIsolation;
@@ -84,4 +85,20 @@ public void testStandardIsolation() {
8485
assertThat(wrapper.toProto("my-project").getAppProfile().getStandardIsolation())
8586
.isEqualTo(StandardIsolation.getDefaultInstance());
8687
}
88+
89+
@Test
90+
public void testDataBoostIsolationReadOnly() {
91+
CreateAppProfileRequest wrapper =
92+
CreateAppProfileRequest.of("my-instance", "my-profile")
93+
.setRoutingPolicy(MultiClusterRoutingPolicy.of())
94+
.setIsolationPolicy(
95+
AppProfile.DataBoostIsolationReadOnlyPolicy.of(
96+
AppProfile.ComputeBillingOwner.HOST_PAYS));
97+
98+
assertThat(wrapper.toProto("my-project").getAppProfile().getDataBoostIsolationReadOnly())
99+
.isEqualTo(
100+
DataBoostIsolationReadOnly.newBuilder()
101+
.setComputeBillingOwner(DataBoostIsolationReadOnly.ComputeBillingOwner.HOST_PAYS)
102+
.build());
103+
}
87104
}

google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/UpdateAppProfileRequestTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static com.google.common.truth.Truth.assertThat;
1919

20+
import com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly;
2021
import com.google.bigtable.admin.v2.AppProfile.MultiClusterRoutingUseAny;
2122
import com.google.bigtable.admin.v2.AppProfile.SingleClusterRouting;
2223
import com.google.bigtable.admin.v2.AppProfile.StandardIsolation;
@@ -111,4 +112,38 @@ public void testUpdateExistingStandardIsolation() {
111112
.setUpdateMask(FieldMask.newBuilder().addPaths("standard_isolation"))
112113
.build());
113114
}
115+
116+
@Test
117+
public void testUpdateExistingDataBoostIsolationReadOnly() {
118+
com.google.bigtable.admin.v2.AppProfile existingProto =
119+
com.google.bigtable.admin.v2.AppProfile.newBuilder()
120+
.setName("projects/my-project/instances/my-instance/appProfiles/my-profile")
121+
.setEtag("my-etag")
122+
.setDescription("description")
123+
.setMultiClusterRoutingUseAny(MultiClusterRoutingUseAny.getDefaultInstance())
124+
.setStandardIsolation(StandardIsolation.getDefaultInstance())
125+
.build();
126+
127+
AppProfile existingWrapper = AppProfile.fromProto(existingProto);
128+
129+
UpdateAppProfileRequest updateWrapper =
130+
UpdateAppProfileRequest.of(existingWrapper)
131+
.setIsolationPolicy(
132+
AppProfile.DataBoostIsolationReadOnlyPolicy.of(
133+
AppProfile.ComputeBillingOwner.HOST_PAYS));
134+
135+
assertThat(updateWrapper.toProto("my-project"))
136+
.isEqualTo(
137+
com.google.bigtable.admin.v2.UpdateAppProfileRequest.newBuilder()
138+
.setAppProfile(
139+
existingProto
140+
.toBuilder()
141+
.setDataBoostIsolationReadOnly(
142+
DataBoostIsolationReadOnly.newBuilder()
143+
.setComputeBillingOwner(
144+
DataBoostIsolationReadOnly.ComputeBillingOwner.HOST_PAYS)
145+
.build()))
146+
.setUpdateMask(FieldMask.newBuilder().addPaths("data_boost_isolation_read_only"))
147+
.build());
148+
}
114149
}

0 commit comments

Comments
 (0)