Skip to content

Commit a134994

Browse files
authored
feat: add Autoclass v2.1 support (#2258)
1 parent eff00fb commit a134994

File tree

4 files changed

+137
-13
lines changed

4 files changed

+137
-13
lines changed

‎google-cloud-storage/src/main/java/com/google/cloud/storage/ApiaryConversions.java‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,13 +484,23 @@ private Bucket.Autoclass autoclassEncode(Autoclass from) {
484484
Bucket.Autoclass to = new Bucket.Autoclass();
485485
ifNonNull(from.getEnabled(), to::setEnabled);
486486
ifNonNull(from.getToggleTime(), dateTimeCodec::encode, to::setToggleTime);
487+
ifNonNull(from.getTerminalStorageClass(), StorageClass::toString, to::setTerminalStorageClass);
488+
ifNonNull(
489+
from.getTerminalStorageClassUpdateTime(),
490+
dateTimeCodec::encode,
491+
to::setTerminalStorageClassUpdateTime);
487492
return to;
488493
}
489494

490495
private Autoclass autoclassDecode(Bucket.Autoclass from) {
491496
Autoclass.Builder to = Autoclass.newBuilder();
492497
to.setEnabled(from.getEnabled());
493498
ifNonNull(from.getToggleTime(), dateTimeCodec::decode, to::setToggleTime);
499+
ifNonNull(from.getTerminalStorageClass(), StorageClass::valueOf, to::setTerminalStorageClass);
500+
ifNonNull(
501+
from.getTerminalStorageClassUpdateTime(),
502+
dateTimeCodec::decode,
503+
to::setTerminalStorageClassUpdateTime);
494504
return to.build();
495505
}
496506

‎google-cloud-storage/src/main/java/com/google/cloud/storage/BucketInfo.java‎

Lines changed: 66 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -344,11 +344,26 @@ public String toString() {
344344
}
345345
}
346346

347+
/**
348+
* Configuration for the Autoclass settings of a bucket.
349+
*
350+
* @see <a
351+
* href="https://cloud.google.com/storage/docs/autoclass">https://cloud.google.com/storage/docs/autoclass</a>
352+
*/
347353
public static final class Autoclass implements Serializable {
348354

349355
private static final long serialVersionUID = -2378172222188072439L;
350-
private Boolean enabled;
351-
private OffsetDateTime toggleTime;
356+
private final Boolean enabled;
357+
private final OffsetDateTime toggleTime;
358+
private final StorageClass terminalStorageClass;
359+
private final OffsetDateTime terminalStorageClassUpdateTime;
360+
361+
private Autoclass(Builder builder) {
362+
this.enabled = builder.enabled;
363+
this.toggleTime = builder.toggleTime;
364+
this.terminalStorageClass = builder.terminalStorageClass;
365+
this.terminalStorageClassUpdateTime = builder.terminalStorageClassUpdateTime;
366+
}
352367

353368
public Boolean getEnabled() {
354369
return enabled;
@@ -358,6 +373,14 @@ public OffsetDateTime getToggleTime() {
358373
return toggleTime;
359374
}
360375

376+
public StorageClass getTerminalStorageClass() {
377+
return terminalStorageClass;
378+
}
379+
380+
public OffsetDateTime getTerminalStorageClassUpdateTime() {
381+
return terminalStorageClassUpdateTime;
382+
}
383+
361384
@Override
362385
public boolean equals(Object o) {
363386
if (this == o) {
@@ -366,41 +389,47 @@ public boolean equals(Object o) {
366389
if (!(o instanceof Autoclass)) {
367390
return false;
368391
}
369-
Autoclass that = (Autoclass) o;
370-
return Objects.equals(enabled, that.enabled) && Objects.equals(toggleTime, that.toggleTime);
392+
Autoclass autoclass = (Autoclass) o;
393+
return Objects.equals(enabled, autoclass.enabled)
394+
&& Objects.equals(toggleTime, autoclass.toggleTime)
395+
&& Objects.equals(terminalStorageClass, autoclass.terminalStorageClass)
396+
&& Objects.equals(
397+
terminalStorageClassUpdateTime, autoclass.terminalStorageClassUpdateTime);
371398
}
372399

373400
@Override
374401
public int hashCode() {
375-
return Objects.hash(enabled, toggleTime);
402+
return Objects.hash(
403+
enabled, toggleTime, terminalStorageClass, terminalStorageClassUpdateTime);
376404
}
377405

378406
@Override
379407
public String toString() {
380408
return MoreObjects.toStringHelper(this)
381409
.add("enabled", enabled)
382410
.add("toggleTime", toggleTime)
411+
.add("terminalStorageClass", terminalStorageClass)
412+
.add("terminalStorageClassUpdateTime", terminalStorageClassUpdateTime)
383413
.toString();
384414
}
385415

386-
private Autoclass() {}
387-
388-
private Autoclass(Builder builder) {
389-
this.enabled = builder.enabled;
390-
this.toggleTime = builder.toggleTime;
391-
}
392-
393416
public static Builder newBuilder() {
394417
return new Builder();
395418
}
396419

397420
public Builder toBuilder() {
398-
return newBuilder().setEnabled(enabled).setToggleTime(toggleTime);
421+
return newBuilder()
422+
.setEnabled(enabled)
423+
.setToggleTime(toggleTime)
424+
.setTerminalStorageClass(terminalStorageClass)
425+
.setTerminalStorageClassUpdateTime(terminalStorageClassUpdateTime);
399426
}
400427

401428
public static final class Builder {
402429
private Boolean enabled;
403430
private OffsetDateTime toggleTime;
431+
private StorageClass terminalStorageClass;
432+
private OffsetDateTime terminalStorageClassUpdateTime;
404433

405434
/**
406435
* Sets whether Autoclass is enabled for this bucket. Currently, autoclass can only be enabled
@@ -421,6 +450,30 @@ Builder setToggleTime(OffsetDateTime toggleTime) {
421450
return this;
422451
}
423452

453+
/**
454+
* When set to {@link StorageClass#NEARLINE}, Autoclass restricts transitions between Standard
455+
* and Nearline storage classes only.
456+
*
457+
* <p>When set to {@link StorageClass#ARCHIVE}, Autoclass allows transitions to Coldline and
458+
* Archive as well.
459+
*
460+
* <p>Only valid values are {@code NEARLINE} and {@code ARCHIVE}.
461+
*/
462+
public Builder setTerminalStorageClass(StorageClass terminalStorageClass) {
463+
this.terminalStorageClass = terminalStorageClass;
464+
return this;
465+
}
466+
467+
/**
468+
* The time at which Autoclass terminal storage class was last updated for this bucket.
469+
*
470+
* <p>This is auto populated when the feature is enabled.
471+
*/
472+
Builder setTerminalStorageClassUpdateTime(OffsetDateTime terminalStorageClassUpdateTime) {
473+
this.terminalStorageClassUpdateTime = terminalStorageClassUpdateTime;
474+
return this;
475+
}
476+
424477
public Autoclass build() {
425478
return new Autoclass(this);
426479
}

‎google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcConversions.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -565,13 +565,27 @@ private BucketInfo.Autoclass autoclassDecode(Bucket.Autoclass from) {
565565
BucketInfo.Autoclass.Builder to = BucketInfo.Autoclass.newBuilder();
566566
to.setEnabled(from.getEnabled());
567567
ifNonNull(from.getToggleTime(), timestampCodec::decode, to::setToggleTime);
568+
569+
String terminalStorageClass = from.getTerminalStorageClass();
570+
if (!terminalStorageClass.isEmpty()) {
571+
to.setTerminalStorageClass(StorageClass.valueOf(terminalStorageClass));
572+
}
573+
ifNonNull(
574+
from.getTerminalStorageClassUpdateTime(),
575+
timestampCodec::decode,
576+
to::setTerminalStorageClassUpdateTime);
568577
return to.build();
569578
}
570579

571580
private Bucket.Autoclass autoclassEncode(BucketInfo.Autoclass from) {
572581
Bucket.Autoclass.Builder to = Bucket.Autoclass.newBuilder();
573582
ifNonNull(from.getEnabled(), to::setEnabled);
574583
ifNonNull(from.getToggleTime(), timestampCodec::encode, to::setToggleTime);
584+
ifNonNull(from.getTerminalStorageClass(), StorageClass::toString, to::setTerminalStorageClass);
585+
ifNonNull(
586+
from.getTerminalStorageClassUpdateTime(),
587+
timestampCodec::encode,
588+
to::setTerminalStorageClassUpdateTime);
575589
return to.build();
576590
}
577591

‎google-cloud-storage/src/test/java/com/google/cloud/storage/it/ITBucketTest.java‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.google.cloud.storage.Storage.BucketGetOption;
4343
import com.google.cloud.storage.Storage.BucketListOption;
4444
import com.google.cloud.storage.Storage.BucketTargetOption;
45+
import com.google.cloud.storage.StorageClass;
4546
import com.google.cloud.storage.TransportCompatibility.Transport;
4647
import com.google.cloud.storage.it.runner.StorageITRunner;
4748
import com.google.cloud.storage.it.runner.annotations.Backend;
@@ -58,6 +59,7 @@
5859
import java.util.Collections;
5960
import java.util.List;
6061
import java.util.Map;
62+
import java.util.Optional;
6163
import java.util.stream.StreamSupport;
6264
import org.junit.Ignore;
6365
import org.junit.Test;
@@ -417,6 +419,51 @@ public void testCreateBucketWithAutoclass() {
417419
}
418420
}
419421

422+
@Test
423+
public void testCreateBucketWithAutoclass_ARCHIVE() throws Exception {
424+
String bucketName = generator.randomBucketName();
425+
Autoclass autoclass =
426+
Autoclass.newBuilder()
427+
.setEnabled(true)
428+
.setTerminalStorageClass(StorageClass.ARCHIVE)
429+
.build();
430+
BucketInfo info = BucketInfo.newBuilder(bucketName).setAutoclass(autoclass).build();
431+
try (TemporaryBucket tmpb =
432+
TemporaryBucket.newBuilder().setStorage(storage).setBucketInfo(info).build()) {
433+
BucketInfo remoteBucket = tmpb.getBucket();
434+
435+
Autoclass remoteBucketAutoclass = remoteBucket.getAutoclass();
436+
assertThat(remoteBucketAutoclass).isNotNull();
437+
assertThat(remoteBucketAutoclass.getEnabled()).isTrue();
438+
assertThat(remoteBucketAutoclass.getToggleTime()).isNotNull();
439+
assertThat(remoteBucketAutoclass.getTerminalStorageClassUpdateTime()).isNotNull();
440+
assertThat(remoteBucketAutoclass.getTerminalStorageClass()).isEqualTo(StorageClass.ARCHIVE);
441+
442+
Page<Bucket> bucketPage = storage.list(BucketListOption.prefix(bucketName));
443+
ImmutableList<Bucket> buckets = ImmutableList.copyOf(bucketPage.iterateAll());
444+
445+
Optional<Bucket> first =
446+
buckets.stream().filter(b -> bucketName.equals(b.getName())).findFirst();
447+
448+
assertThat(first.isPresent()).isTrue();
449+
assertThat(first.get().getAutoclass().getTerminalStorageClass())
450+
.isEqualTo(StorageClass.ARCHIVE);
451+
452+
BucketInfo disabled =
453+
remoteBucket
454+
.toBuilder()
455+
.setAutoclass(Autoclass.newBuilder().setEnabled(false).build())
456+
.build();
457+
Bucket updated = storage.update(disabled, BucketTargetOption.metagenerationMatch());
458+
459+
Autoclass updatedAutoclass = updated.getAutoclass();
460+
assertThat(updatedAutoclass.getEnabled()).isFalse();
461+
assertThat(updatedAutoclass.getTerminalStorageClass()).isNull();
462+
463+
assertThat(updatedAutoclass).isNotEqualTo(remoteBucketAutoclass);
464+
}
465+
}
466+
420467
@Test
421468
public void testUpdateBucket_noModification() throws Exception {
422469
String bucketName = generator.randomBucketName();

0 commit comments

Comments
 (0)