JCLOUDS-1337: GCS putBlob portable storage tiers
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/14c41ea1 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/14c41ea1 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/14c41ea1 Branch: refs/heads/master Commit: 14c41ea1331e4cae8a563c8bb8615b64362eefb2 Parents: 61d4be8 Author: Andrew Gaul <[email protected]> Authored: Tue Oct 10 23:08:22 2017 -0700 Committer: Andrew Gaul <[email protected]> Committed: Thu Oct 12 11:15:14 2017 -0700 ---------------------------------------------------------------------- .../blobstore/GoogleCloudStorageBlobStore.java | 12 ++++--- .../functions/BlobMetadataToObjectTemplate.java | 4 ++- .../functions/ObjectToBlobMetadata.java | 1 + .../domain/DomainResourceReferences.java | 33 +++++++++++++++++--- ...ogleCloudStorageBlobIntegrationLiveTest.java | 21 +++++++++++++ 5 files changed, 60 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/14c41ea1/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GoogleCloudStorageBlobStore.java ---------------------------------------------------------------------- diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GoogleCloudStorageBlobStore.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GoogleCloudStorageBlobStore.java index 532a8de..a5f1338 100644 --- a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GoogleCloudStorageBlobStore.java +++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/GoogleCloudStorageBlobStore.java @@ -66,7 +66,6 @@ import org.jclouds.googlecloudstorage.domain.templates.BucketTemplate; import org.jclouds.googlecloudstorage.domain.templates.ComposeObjectTemplate; import org.jclouds.googlecloudstorage.domain.templates.ObjectAccessControlsTemplate; import org.jclouds.googlecloudstorage.domain.templates.ObjectTemplate; -import org.jclouds.googlecloudstorage.options.InsertObjectOptions; import org.jclouds.googlecloudstorage.options.ListObjectOptions; import org.jclouds.http.HttpResponseException; import org.jclouds.io.ContentMetadata; @@ -392,6 +391,8 @@ public final class GoogleCloudStorageBlobStore extends BaseBlobStore { } ObjectTemplate destination = blobMetadataToObjectTemplate.apply(mpu.blobMetadata()); + // unset storage class because the subobjects store this state + destination.storageClass(DomainResourceReferences.StorageClass.STANDARD); if (mpu.putOptions().getBlobAccess() == BlobAccess.PUBLIC_READ) { ObjectAccessControls controls = ObjectAccessControls.builder() .entity("allUsers") @@ -421,10 +422,11 @@ public final class GoogleCloudStorageBlobStore extends BaseBlobStore { public MultipartPart uploadMultipartPart(MultipartUpload mpu, int partNumber, Payload payload) { String partName = getMPUPartName(mpu, partNumber); long partSize = payload.getContentMetadata().getContentLength(); - // TODO: JCLOUDS-1337: use multipartUpload to set storage class - InsertObjectOptions insertOptions = new InsertObjectOptions().name(partName); - GoogleCloudStorageObject object = api.getObjectApi().simpleUpload(mpu.containerName(), - mpu.blobMetadata().getContentMetadata().getContentType(), partSize, payload, insertOptions); + ObjectTemplate template = blobMetadataToObjectTemplate.apply(mpu.blobMetadata()) + .name(partName) + .size(partSize); + GoogleCloudStorageObject object = api.getObjectApi().multipartUpload( + mpu.containerName(), template, payload); return MultipartPart.create(partNumber, partSize, object.etag(), object.updated()); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/14c41ea1/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java ---------------------------------------------------------------------- diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java index e40ce49..2f40be3 100644 --- a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java +++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/BlobMetadataToObjectTemplate.java @@ -21,6 +21,7 @@ import static com.google.common.io.BaseEncoding.base64; import java.util.Map; import org.jclouds.blobstore.domain.BlobMetadata; +import org.jclouds.googlecloudstorage.domain.DomainResourceReferences.StorageClass; import org.jclouds.googlecloudstorage.domain.templates.ObjectTemplate; import org.jclouds.io.ContentMetadata; @@ -47,7 +48,8 @@ public class BlobMetadataToObjectTemplate implements Function<BlobMetadata, Obje ObjectTemplate template = new ObjectTemplate().contentType(contentType).size(contentLength) .contentEncoding(contentEncoding).contentLanguage(contentLanguage) - .contentDisposition(contentDisposition).name(name).customMetadata(userMeta); + .contentDisposition(contentDisposition).name(name).customMetadata(userMeta) + .storageClass(StorageClass.fromTier(from.getTier())); if (md5 != null) { template.md5Hash(base64().encode(md5.asBytes())); } http://git-wip-us.apache.org/repos/asf/jclouds/blob/14c41ea1/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java ---------------------------------------------------------------------- diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java index 4a6cf7d..66ab25a 100644 --- a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java +++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/blobstore/functions/ObjectToBlobMetadata.java @@ -50,6 +50,7 @@ public class ObjectToBlobMetadata implements Function<GoogleCloudStorageObject, to.setPublicUri(from.mediaLink()); to.setType(StorageType.BLOB); to.setSize(from.size()); + to.setTier(from.storageClass().toTier()); return to; } http://git-wip-us.apache.org/repos/asf/jclouds/blob/14c41ea1/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java ---------------------------------------------------------------------- diff --git a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java index cc3b9dc..f27b08f 100644 --- a/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java +++ b/providers/google-cloud-storage/src/main/java/org/jclouds/googlecloudstorage/domain/DomainResourceReferences.java @@ -16,6 +16,10 @@ */ package org.jclouds.googlecloudstorage.domain; +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.blobstore.domain.Tier; + import com.google.common.base.CaseFormat; public final class DomainResourceReferences { @@ -45,11 +49,30 @@ public final class DomainResourceReferences { } public enum StorageClass { - COLDLINE, - DURABLE_REDUCED_AVAILABILITY, - MULTI_REGIONAL, - NEARLINE, - STANDARD; + COLDLINE(Tier.ARCHIVE), + DURABLE_REDUCED_AVAILABILITY(Tier.STANDARD), + MULTI_REGIONAL(Tier.STANDARD), + NEARLINE(Tier.INFREQUENT), + STANDARD(Tier.STANDARD); + + private final Tier tier; + + private StorageClass(Tier tier) { + this.tier = checkNotNull(tier, "tier"); + } + + public static StorageClass fromTier(Tier tier) { + switch (tier) { + case STANDARD: return StorageClass.STANDARD; + case INFREQUENT: return StorageClass.NEARLINE; + case ARCHIVE: return StorageClass.COLDLINE; + } + throw new IllegalArgumentException("invalid tier: " + tier); + } + + public Tier toTier() { + return tier; + } } public enum Projection { http://git-wip-us.apache.org/repos/asf/jclouds/blob/14c41ea1/providers/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/blobstore/integration/GoogleCloudStorageBlobIntegrationLiveTest.java ---------------------------------------------------------------------- diff --git a/providers/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/blobstore/integration/GoogleCloudStorageBlobIntegrationLiveTest.java b/providers/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/blobstore/integration/GoogleCloudStorageBlobIntegrationLiveTest.java index 524ac20..d1866a9 100644 --- a/providers/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/blobstore/integration/GoogleCloudStorageBlobIntegrationLiveTest.java +++ b/providers/google-cloud-storage/src/test/java/org/jclouds/googlecloudstorage/blobstore/integration/GoogleCloudStorageBlobIntegrationLiveTest.java @@ -17,6 +17,7 @@ package org.jclouds.googlecloudstorage.blobstore.integration; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Fail.failBecauseExceptionWasNotThrown; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; @@ -310,4 +311,24 @@ public class GoogleCloudStorageBlobIntegrationLiveTest extends BaseBlobIntegrati throw new SkipException("GCS does not support listing multipart uploads", uoe); } } + + @Override + public void testPutBlobTierArchiveMultipart() throws Exception { + try { + super.testPutBlobTierArchiveMultipart(); + failBecauseExceptionWasNotThrown(AssertionError.class); + } catch (AssertionError ae) { + throw new SkipException("GCS does not report storage class of composed objects", ae); + } + } + + @Override + public void testPutBlobTierInfrequentMultipart() throws Exception { + try { + super.testPutBlobTierInfrequentMultipart(); + failBecauseExceptionWasNotThrown(AssertionError.class); + } catch (AssertionError ae) { + throw new SkipException("GCS does not report storage class of composed objects", ae); + } + } }
