JCLOUDS-1337: Azure 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/152ca564 Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/152ca564 Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/152ca564 Branch: refs/heads/master Commit: 152ca564b5e93aa3c8b7f94e1c65a44af6e04db0 Parents: 6158b60 Author: Andrew Gaul <[email protected]> Authored: Tue Sep 26 21:21:33 2017 -0700 Committer: Andrew Gaul <[email protected]> Committed: Thu Oct 12 11:15:14 2017 -0700 ---------------------------------------------------------------------- .../azureblob/blobstore/AzureBlobStore.java | 15 ++++++++--- .../functions/BlobPropertiesToBlobMetadata.java | 3 +++ .../jclouds/azureblob/domain/AccessTier.java | 28 +++++++++++++++++--- 3 files changed, 40 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/152ca564/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java index a64db15..a2bf864 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/AzureBlobStore.java @@ -39,6 +39,7 @@ import org.jclouds.azureblob.blobstore.functions.BlobToAzureBlob; import org.jclouds.azureblob.blobstore.functions.ContainerToResourceMetadata; import org.jclouds.azureblob.blobstore.functions.ListBlobsResponseToResourceList; import org.jclouds.azureblob.blobstore.functions.ListOptionsToListBlobsOptions; +import org.jclouds.azureblob.domain.AccessTier; import org.jclouds.azureblob.domain.AzureBlob; import org.jclouds.azureblob.domain.BlobBlockProperties; import org.jclouds.azureblob.domain.BlobProperties; @@ -59,6 +60,7 @@ import org.jclouds.blobstore.domain.MultipartPart; import org.jclouds.blobstore.domain.MultipartUpload; import org.jclouds.blobstore.domain.PageSet; import org.jclouds.blobstore.domain.StorageMetadata; +import org.jclouds.blobstore.domain.Tier; import org.jclouds.blobstore.domain.internal.PageSetImpl; import org.jclouds.blobstore.functions.BlobToHttpGetOptions; import org.jclouds.blobstore.internal.BaseBlobStore; @@ -215,7 +217,7 @@ public class AzureBlobStore extends BaseBlobStore { */ @Override public String putBlob(String container, Blob blob) { - return sync.putBlob(container, blob2AzureBlob.apply(blob)); + return putBlob(container, blob, new PutOptions()); } /** @@ -231,10 +233,17 @@ public class AzureBlobStore extends BaseBlobStore { if (options.getBlobAccess() != BlobAccess.PRIVATE) { throw new UnsupportedOperationException("blob access not supported by Azure"); } + String eTag; if (options.isMultipart()) { - return putMultipartBlob(container, blob, options); + eTag = putMultipartBlob(container, blob, options); + } else { + eTag = sync.putBlob(container, blob2AzureBlob.apply(blob)); + } + Tier tier = blob.getMetadata().getTier(); + if (tier != Tier.STANDARD) { + sync.setBlobTier(container, blob.getMetadata().getName(), AccessTier.fromTier(tier)); } - return putBlob(container, blob); + return eTag; } @Override http://git-wip-us.apache.org/repos/asf/jclouds/blob/152ca564/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/functions/BlobPropertiesToBlobMetadata.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/functions/BlobPropertiesToBlobMetadata.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/functions/BlobPropertiesToBlobMetadata.java index 6bab7e4..6a1eb43 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/functions/BlobPropertiesToBlobMetadata.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/blobstore/functions/BlobPropertiesToBlobMetadata.java @@ -21,6 +21,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.azureblob.domain.AccessTier; import org.jclouds.azureblob.domain.BlobProperties; import org.jclouds.azureblob.domain.PublicAccess; import org.jclouds.blobstore.domain.MutableBlobMetadata; @@ -67,6 +68,8 @@ public class BlobPropertiesToBlobMetadata implements Function<BlobProperties, Mu to.setType(StorageType.BLOB); } to.setSize(from.getContentMetadata().getContentLength()); + AccessTier tier = from.getTier(); + to.setTier((tier != null ? tier : AccessTier.HOT).toTier()); return to; } } http://git-wip-us.apache.org/repos/asf/jclouds/blob/152ca564/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/AccessTier.java ---------------------------------------------------------------------- diff --git a/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/AccessTier.java b/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/AccessTier.java index 02f03ca..3c99ef6 100644 --- a/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/AccessTier.java +++ b/providers/azureblob/src/main/java/org/jclouds/azureblob/domain/AccessTier.java @@ -18,12 +18,20 @@ package org.jclouds.azureblob.domain; import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.blobstore.domain.Tier; + import com.google.common.base.CaseFormat; public enum AccessTier { - HOT, - COOL, - ARCHIVE; + HOT(Tier.STANDARD), + COOL(Tier.INFREQUENT), + ARCHIVE(Tier.ARCHIVE); + + private final Tier tier; + + private AccessTier(Tier tier) { + this.tier = checkNotNull(tier); + } public String value() { return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, name()); @@ -34,7 +42,21 @@ public enum AccessTier { return value(); } + // TODO: call valueOf instead like GCS? public static AccessTier fromValue(String tier) { return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(tier, "tier"))); } + + public static AccessTier fromTier(Tier tier) { + switch (tier) { + case STANDARD: return AccessTier.HOT; + case INFREQUENT: return AccessTier.COOL; + case ARCHIVE: return AccessTier.ARCHIVE; + } + throw new IllegalArgumentException("invalid tier: " + tier); + } + + public Tier toTier() { + return tier; + } }
