Visitar URL original
feat: admin API changes for databoost · googleapis/java-bigtable@2837356 · GitHub
Skip to content
This repository was archived by the owner on Aug 30, 2026. It is now read-only.

Commit 2837356

Browse files
committed
feat: admin API changes for databoost
1 parent 3f29030 commit 2837356

6 files changed

Lines changed: 227 additions & 1 deletion

File tree

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

Lines changed: 110 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,111 @@ public int hashCode() {
409412
return Objects.hashCode(proto);
410413
}
411414
}
415+
416+
/**
417+
* Compute Billing Owner specifies how usage should be accounted when using Data Boost. Compute
418+
* Billing Owner also configures which Cloud Project is charged for relevant quota.
419+
*/
420+
public static enum ComputeBillingOwner {
421+
UNSPECIFIED(DataBoostIsolationReadOnly.ComputeBillingOwner.COMPUTE_BILLING_OWNER_UNSPECIFIED),
422+
HOST_PAYS(DataBoostIsolationReadOnly.ComputeBillingOwner.HOST_PAYS);
423+
424+
private final com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly
425+
.ComputeBillingOwner
426+
proto;
427+
428+
/**
429+
* Wraps the protobuf. This method is considered an internal implementation detail and not meant
430+
* to be used by applications.
431+
*/
432+
@InternalApi
433+
public static ComputeBillingOwner fromProto(
434+
com.google.bigtable.admin.v2.AppProfile.DataBoostIsolationReadOnly.ComputeBillingOwner
435+
proto) {
436+
Preconditions.checkNotNull(proto);
437+
438+
for (ComputeBillingOwner owner : values()) {
439+
if (owner.proto.equals(proto)) {
440+
return owner;
441+
}
442+
}
443+
444+
throw new IllegalArgumentException("Unknown billing owner: " + proto);
445+
}
446+
447+
/**
448+
* Creates the request protobuf. This method is considered an internal implementation detail and
449+
* not meant to be used by applications.
450+
*/
451+
@InternalApi
452+
public DataBoostIsolationReadOnly.ComputeBillingOwner toProto() {
453+
return proto;
454+
}
455+
456+
ComputeBillingOwner(DataBoostIsolationReadOnly.ComputeBillingOwner proto) {
457+
this.proto = proto;
458+
}
459+
}
460+
461+
/**
462+
* A Data Boost Read Only {@link IsolationPolicy} for running high-throughput read traffic on your
463+
* Bigtable data without affecting application traffic.
464+
*/
465+
public static class DataBoostIsolationReadOnlyPolicy implements IsolationPolicy {
466+
private final DataBoostIsolationReadOnly proto;
467+
468+
DataBoostIsolationReadOnlyPolicy(DataBoostIsolationReadOnly proto) {
469+
this.proto = proto;
470+
}
471+
472+
/**
473+
* Creates a new instance of {@link DataBoostIsolationReadOnlyPolicy} with specified {@link
474+
* ComputeBillingOwner}.
475+
*/
476+
public static DataBoostIsolationReadOnlyPolicy of(ComputeBillingOwner billingOwner) {
477+
return new DataBoostIsolationReadOnlyPolicy(
478+
DataBoostIsolationReadOnly.newBuilder()
479+
.setComputeBillingOwner(billingOwner.toProto())
480+
.build());
481+
}
482+
483+
/** Creates a new instance of {@link DataBoostIsolationReadOnlyPolicy}. */
484+
public static DataBoostIsolationReadOnlyPolicy of() {
485+
return new DataBoostIsolationReadOnlyPolicy(DataBoostIsolationReadOnly.getDefaultInstance());
486+
}
487+
488+
/**
489+
* Gets the {@link ComputeBillingOwner} on the current {@link DataBoostIsolationReadOnlyPolicy}
490+
* instance.
491+
*/
492+
public ComputeBillingOwner getComputeBillingOwner() {
493+
return ComputeBillingOwner.fromProto(proto.getComputeBillingOwner());
494+
}
495+
496+
/**
497+
* Creates the request protobuf. This method is considered an internal implementation detail and
498+
* not meant to be used by applications.
499+
*/
500+
@InternalApi
501+
public DataBoostIsolationReadOnly toProto() {
502+
return proto;
503+
}
504+
505+
@Override
506+
public boolean equals(Object o) {
507+
if (this == o) {
508+
return true;
509+
}
510+
if (o == null || getClass() != o.getClass()) {
511+
return false;
512+
}
513+
DataBoostIsolationReadOnlyPolicy that = (DataBoostIsolationReadOnlyPolicy) o;
514+
return Objects.equal(proto, that.proto);
515+
}
516+
517+
@Override
518+
public int hashCode() {
519+
return Objects.hashCode(proto);
520+
}
521+
}
412522
}

‎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/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: 12 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,15 @@ 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(AppProfile.DataBoostIsolationReadOnlyPolicy.of());
95+
96+
assertThat(wrapper.toProto("my-project").getAppProfile().getDataBoostIsolationReadOnly())
97+
.isEqualTo(DataBoostIsolationReadOnly.getDefaultInstance());
98+
}
8799
}

‎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)