From b97fc2ea2eef3a11f41a3e99f4de323b8c1e6306 Mon Sep 17 00:00:00 2001 From: browndav Date: Wed, 11 Mar 2026 21:14:06 -0400 Subject: [PATCH 01/20] generate new api based on swaggerfile --- .../models/BlobItemPropertiesInternal.java | 33 +++++++++++++++++++ .../models/BlobsGetPropertiesHeaders.java | 31 +++++++++++++++++ .../azure/storage/blob/models/AccessTier.java | 6 ++++ .../storage/blob/models/ArchiveStatus.java | 6 ++++ .../azure-storage-blob/swagger/README.md | 2 +- 5 files changed, 77 insertions(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobItemPropertiesInternal.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobItemPropertiesInternal.java index 185a2cb3318e..909005607d59 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobItemPropertiesInternal.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobItemPropertiesInternal.java @@ -205,6 +205,12 @@ public final class BlobItemPropertiesInternal implements XmlSerializable { @Generated public static final AccessTier COLD = fromString("Cold"); + /** + * Static value Smart for AccessTier. + */ + @Generated + public static final AccessTier SMART = fromString("Smart"); + /** * Creates a new instance of AccessTier value. * diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/ArchiveStatus.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/ArchiveStatus.java index d4a413e5f7d3..07f0843fd32b 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/ArchiveStatus.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/ArchiveStatus.java @@ -30,6 +30,12 @@ public final class ArchiveStatus extends ExpandableStringEnum { @Generated public static final ArchiveStatus REHYDRATE_PENDING_TO_COLD = fromString("rehydrate-pending-to-cold"); + /** + * Static value rehydrate-pending-to-smart for ArchiveStatus. + */ + @Generated + public static final ArchiveStatus REHYDRATE_PENDING_TO_SMART = fromString("rehydrate-pending-to-smart"); + /** * Creates a new instance of ArchiveStatus value. * diff --git a/sdk/storage/azure-storage-blob/swagger/README.md b/sdk/storage/azure-storage-blob/swagger/README.md index a0c217b3c4ef..851c87ce4faa 100644 --- a/sdk/storage/azure-storage-blob/swagger/README.md +++ b/sdk/storage/azure-storage-blob/swagger/README.md @@ -16,7 +16,7 @@ autorest ### Code generation settings ``` yaml use: '@autorest/java@4.1.62' -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/a30ef1ee2e9795f4d77e8c62fad52b33e60d4cb7/specification/storage/data-plane/Microsoft.BlobStorage/stable/2026-04-06/blob.json +input-file: https://raw.githubusercontent.com/nickliu-msft/azure-rest-api-specs/1ee23319226b26175ed9dbb27fc65d24932b9227/specification/storage/data-plane/Microsoft.BlobStorage/stable/2026-06-06/blob.json java: true output-folder: ../ namespace: com.azure.storage.blob From b29e9ecd6baec718ea345924b92321dd15229fec Mon Sep 17 00:00:00 2001 From: browndav Date: Wed, 11 Mar 2026 21:17:47 -0400 Subject: [PATCH 02/20] create base test for new api --- .../storage/blob/batch/BatchApiTests.java | 25 ++++++++++++++++++- .../storage/blob/batch/BlobBatchTestBase.java | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BatchApiTests.java b/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BatchApiTests.java index fc73d04fe5c3..94611d8dd325 100644 --- a/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BatchApiTests.java +++ b/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BatchApiTests.java @@ -111,7 +111,30 @@ public void setTierAllSucceed() { .upload(DATA.getDefaultInputStream(), DATA.getDefaultDataSize()); Response response1 = batch.setBlobAccessTier(containerName, blobName1, AccessTier.HOT); - Response response2 = batch.setBlobAccessTier(containerName, blobName2, AccessTier.COOL); + // Response response2 = batch.setBlobAccessTier(containerName, blobName2, AccessTier.COOL); + batchClient.submitBatch(batch); + + assertEquals(200, response1.getStatusCode()); + // assertEquals(200, response2.getStatusCode()); + } + + @Test + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + public void setBlobAccessTierSmart() { + String containerName = generateContainerName(); + String blobName1 = generateBlobName(); + String blobName2 = generateBlobName(); + BlobBatch batch = batchClient.getBlobBatch(); + BlobContainerClient containerClient = premiumStorageBlobServiceClient.createBlobContainer(containerName); + containerClient.getBlobClient(blobName1) + .getBlockBlobClient() + .upload(DATA.getDefaultInputStream(), DATA.getDefaultDataSize()); + containerClient.getBlobClient(blobName2) + .getBlockBlobClient() + .upload(DATA.getDefaultInputStream(), DATA.getDefaultDataSize()); + + Response response1 = batch.setBlobAccessTier(containerName, blobName1, AccessTier.SMART); + Response response2 = batch.setBlobAccessTier(containerName, blobName2, AccessTier.SMART); batchClient.submitBatch(batch); assertEquals(200, response1.getStatusCode()); diff --git a/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BlobBatchTestBase.java b/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BlobBatchTestBase.java index 1be0876741f2..41c8511790cc 100644 --- a/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BlobBatchTestBase.java +++ b/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BlobBatchTestBase.java @@ -45,6 +45,7 @@ public class BlobBatchTestBase extends TestProxyTestBase { protected BlobServiceClient primaryBlobServiceClient; protected BlobServiceAsyncClient primaryBlobServiceAsyncClient; protected BlobServiceClient versionedBlobServiceClient; + protected BlobServiceClient premiumStorageBlobServiceClient; @Override public void beforeTest() { @@ -64,6 +65,7 @@ public void beforeTest() { primaryBlobServiceClient = getServiceClient(ENVIRONMENT.getPrimaryAccount()); primaryBlobServiceAsyncClient = getServiceAsyncClient(ENVIRONMENT.getPrimaryAccount()); versionedBlobServiceClient = getServiceClient(ENVIRONMENT.getPrimaryAccount()); + premiumStorageBlobServiceClient = getServiceClient(ENVIRONMENT.getPremiumFileAccount()); } /** From 50b152efa092602963021d65feeb1f6c5f200f5e Mon Sep 17 00:00:00 2001 From: browndav Date: Thu, 12 Mar 2026 10:43:21 -0400 Subject: [PATCH 03/20] switch to premiumstorageaccount for smart-tier --- .../java/com/azure/storage/blob/batch/BatchApiTests.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BatchApiTests.java b/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BatchApiTests.java index 94611d8dd325..e409835fa982 100644 --- a/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BatchApiTests.java +++ b/sdk/storage/azure-storage-blob-batch/src/test/java/com/azure/storage/blob/batch/BatchApiTests.java @@ -124,7 +124,8 @@ public void setBlobAccessTierSmart() { String containerName = generateContainerName(); String blobName1 = generateBlobName(); String blobName2 = generateBlobName(); - BlobBatch batch = batchClient.getBlobBatch(); + BlobBatchClient premiumBatchClient = new BlobBatchClientBuilder(premiumStorageBlobServiceClient).buildClient(); + BlobBatch batch = premiumBatchClient.getBlobBatch(); BlobContainerClient containerClient = premiumStorageBlobServiceClient.createBlobContainer(containerName); containerClient.getBlobClient(blobName1) .getBlockBlobClient() @@ -135,7 +136,7 @@ public void setBlobAccessTierSmart() { Response response1 = batch.setBlobAccessTier(containerName, blobName1, AccessTier.SMART); Response response2 = batch.setBlobAccessTier(containerName, blobName2, AccessTier.SMART); - batchClient.submitBatch(batch); + premiumBatchClient.submitBatch(batch); assertEquals(200, response1.getStatusCode()); assertEquals(200, response2.getStatusCode()); From e8aa8ed4e267246e32b6fa2c511eca5994abefeb Mon Sep 17 00:00:00 2001 From: browndav Date: Thu, 12 Mar 2026 11:18:29 -0400 Subject: [PATCH 04/20] recording for setblobaccesstiersmart --- sdk/storage/azure-storage-blob-batch/assets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob-batch/assets.json b/sdk/storage/azure-storage-blob-batch/assets.json index 89bf38f04c2b..b12a0133eb36 100644 --- a/sdk/storage/azure-storage-blob-batch/assets.json +++ b/sdk/storage/azure-storage-blob-batch/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "java", "TagPrefix": "java/storage/azure-storage-blob-batch", - "Tag": "java/storage/azure-storage-blob-batch_1951fdc3fd" + "Tag": "java/storage/azure-storage-blob-batch_0f2e86f753" } From 216e1a7cdeb33bee3e6d5b3d81dd7c753664f7e2 Mon Sep 17 00:00:00 2001 From: browndav Date: Thu, 12 Mar 2026 12:15:23 -0400 Subject: [PATCH 05/20] rerecording for setblobaccesstiersmart --- sdk/storage/azure-storage-blob-batch/assets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob-batch/assets.json b/sdk/storage/azure-storage-blob-batch/assets.json index b12a0133eb36..04167ec7d44c 100644 --- a/sdk/storage/azure-storage-blob-batch/assets.json +++ b/sdk/storage/azure-storage-blob-batch/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "java", "TagPrefix": "java/storage/azure-storage-blob-batch", - "Tag": "java/storage/azure-storage-blob-batch_0f2e86f753" + "Tag": "java/storage/azure-storage-blob-batch_c409ea68db" } From 7b2cc60918393e40219c394c20a75b27b6afddf4 Mon Sep 17 00:00:00 2001 From: Isabelle Date: Thu, 12 Mar 2026 10:19:53 -0700 Subject: [PATCH 06/20] updating assets --- sdk/storage/azure-storage-blob-batch/assets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob-batch/assets.json b/sdk/storage/azure-storage-blob-batch/assets.json index 04167ec7d44c..309de98d6650 100644 --- a/sdk/storage/azure-storage-blob-batch/assets.json +++ b/sdk/storage/azure-storage-blob-batch/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "java", "TagPrefix": "java/storage/azure-storage-blob-batch", - "Tag": "java/storage/azure-storage-blob-batch_c409ea68db" + "Tag": "java/storage/azure-storage-blob-batch_45e14073e7" } From 85b2860e4fcc53a64b4bf76ef522187b26459167 Mon Sep 17 00:00:00 2001 From: browndav Date: Thu, 12 Mar 2026 17:34:30 -0400 Subject: [PATCH 07/20] add SMART access tier in enum, accessTierInferred and smartAcessTier to PathProps --- .../file/datalake/models/AccessTier.java | 5 ++ .../file/datalake/models/PathProperties.java | 59 +++++++++++++------ 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/AccessTier.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/AccessTier.java index b3ab61632b22..7f9772158f75 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/AccessTier.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/AccessTier.java @@ -82,6 +82,11 @@ public final class AccessTier extends ExpandableStringEnum { */ public static final AccessTier ARCHIVE = fromString("Archive"); + /** + * Static value Smart for AccessTier. + */ + public static final AccessTier SMART = fromString("Smart"); + /** * Creates a new instance of {@link AccessTier} with no string value. * diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java index bbfe90b43c33..5f66893e7a1e 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java @@ -37,6 +37,8 @@ public class PathProperties { private final Boolean isServerEncrypted; private final Boolean isIncrementalCopy; private final AccessTier accessTier; + private final boolean accessTierInferred; + private final AccessTier smartAccessTier; private final ArchiveStatus archiveStatus; private final String encryptionKeySha256; private final OffsetDateTime accessTierChangeTime; @@ -96,17 +98,18 @@ public class PathProperties { * pass {@code null}. */ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime lastModified, final String eTag, - final long fileSize, final String contentType, final byte[] contentMd5, final String contentEncoding, - final String contentDisposition, final String contentLanguage, final String cacheControl, - final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, - final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, - final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, - final Boolean isIncrementalCopy, final AccessTier accessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, - final Map metadata) { + final long fileSize, final String contentType, final byte[] contentMd5, final String contentEncoding, + final String contentDisposition, final String contentLanguage, final String cacheControl, + final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, + final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, + final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, + final Boolean isIncrementalCopy, final AccessTier accessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, + final Map metadata, boolean accessTierInferred, AccessTier smartAccessTier) { this(creationTime, lastModified, eTag, fileSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, - copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, isIncrementalCopy, accessTier, + copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, isIncrementalCopy, accessTier + , accessTierInferred, smartAccessTier, archiveStatus, encryptionKeySha256, accessTierChangeTime, metadata, null); } @@ -143,14 +146,14 @@ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime la * @param expiresOn the time when the path is going to expire. */ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime lastModified, final String eTag, - final long fileSize, final String contentType, final byte[] contentMd5, final String contentEncoding, - final String contentDisposition, final String contentLanguage, final String cacheControl, - final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, - final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, - final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, - final Boolean isIncrementalCopy, final AccessTier accessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, - final OffsetDateTime expiresOn) { + final long fileSize, final String contentType, final byte[] contentMd5, final String contentEncoding, + final String contentDisposition, final String contentLanguage, final String cacheControl, + final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, + final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, + final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, + final Boolean isIncrementalCopy, final AccessTier accessTier, boolean accessTierInferred, AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, + final OffsetDateTime expiresOn) { this.creationTime = creationTime; this.lastModified = lastModified; this.eTag = eTag; @@ -173,6 +176,8 @@ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime la this.isServerEncrypted = isServerEncrypted; this.isIncrementalCopy = isIncrementalCopy; this.accessTier = accessTier; + this.accessTierInferred = accessTierInferred; + this.smartAccessTier = smartAccessTier; this.archiveStatus = archiveStatus; this.encryptionKeySha256 = encryptionKeySha256; this.accessTierChangeTime = accessTierChangeTime; @@ -391,6 +396,17 @@ public AccessTier getAccessTier() { return accessTier; } + /** + * Gets whether the access tier of the path was inferred by the service. + * + * @return whether the access tier of the path was inferred by the service. + */ + public boolean isAccessTierInferred() { + return accessTierInferred; + } + + + /** * Gets the archive status of the path. * @@ -418,6 +434,15 @@ public OffsetDateTime getAccessTierChangeTime() { return accessTierChangeTime; } + /** + * Get the underlying tier of a smart tier blob. Only returned if the blob is in Smart tier. + * + * @return the tier of the path. + */ + public AccessTier getSmartAccessTier(){ + return smartAccessTier; + } + /** * Gets the metadata associated to this path. * From 2836cbaafff406c8233b53cf83b1f13ff4ef1db2 Mon Sep 17 00:00:00 2001 From: browndav Date: Thu, 12 Mar 2026 18:05:11 -0400 Subject: [PATCH 08/20] create basic test for smart tier in datalake --- .../azure/storage/file/datalake/FileApiTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileApiTest.java b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileApiTest.java index db4f76d5ea54..bf9d2631a3bd 100644 --- a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileApiTest.java +++ b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileApiTest.java @@ -1042,6 +1042,22 @@ public void getPropertiesDefault() { assertFalse(properties.isDirectory()); } + @Test + @RequiredServiceVersion(clazz = DataLakeServiceVersion.class, min = "2026-02-04") + public void getInferredTierWhenAssignedSmart() { + // Arrange + // fc already has a created file + + Response response = fc.getPropertiesWithResponse(null, null, null); + HttpHeaders headers = response.getHeaders(); + PathProperties properties = response.getValue(); + + validateBasicHeaders(headers); + + assertTrue(properties.isAccessTierInferred()); + assertEquals(AccessTier.SMART, properties.getSmartAccessTier()); + } + @Test public void getPropertiesMin() { assertEquals(200, fc.getPropertiesWithResponse(null, null, null).getStatusCode()); From 2cb8e5ca732360a232717f93b3cd5206c9d909e4 Mon Sep 17 00:00:00 2001 From: browndav Date: Thu, 12 Mar 2026 18:08:36 -0400 Subject: [PATCH 09/20] fix linting in PathProperties --- .../com/azure/storage/file/datalake/models/PathProperties.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java index 5f66893e7a1e..65122071f495 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java @@ -405,8 +405,6 @@ public boolean isAccessTierInferred() { return accessTierInferred; } - - /** * Gets the archive status of the path. * From 00fb711d92cad6c66695195a9c580461ff312d63 Mon Sep 17 00:00:00 2001 From: browndav Date: Thu, 12 Mar 2026 19:47:38 -0400 Subject: [PATCH 10/20] fixed broken deps for FileApiTest#getInferredTierWhenAssignedSmart - We needed to add AccessTier smartAccessTier to all constructors in BlobProperties, which is different than what is recommended in BlobPropertiesInternal. Made a deliberate decision to go this route, but will go the other route, if necessessary --- .../BlobPropertiesConstructorProxy.java | 2 +- .../models/BlobPropertiesInternal.java | 2 + ...opertiesInternalConstructorProperties.java | 22 +++-- .../BlobPropertiesInternalDownload.java | 5 + .../BlobPropertiesInternalGetProperties.java | 5 + .../storage/blob/models/BlobProperties.java | 99 +++++++++++-------- .../storage/file/datalake/Transforms.java | 3 +- .../file/datalake/models/PathProperties.java | 40 ++++---- 8 files changed, 110 insertions(+), 68 deletions(-) diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/accesshelpers/BlobPropertiesConstructorProxy.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/accesshelpers/BlobPropertiesConstructorProxy.java index d8dd06e9b6ce..3a1bd6543362 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/accesshelpers/BlobPropertiesConstructorProxy.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/accesshelpers/BlobPropertiesConstructorProxy.java @@ -51,7 +51,7 @@ public static BlobProperties create(BlobPropertiesInternal internalProperties) { // is null this effectively pokes the class to set up the accessor. if (accessor == null) { new BlobProperties(null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); } assert accessor != null; diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternal.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternal.java index fc7de467ffc7..f90cf0485a4b 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternal.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternal.java @@ -171,6 +171,8 @@ public interface BlobPropertiesInternal { */ Boolean isAccessTierInferred(); + AccessTier getSmartAccessTier(); + /** * @return the archive status of the blob. This is only for blobs on a blob storage and general purpose v2 account. */ diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalConstructorProperties.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalConstructorProperties.java index 4e00fc508d14..7404af040770 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalConstructorProperties.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalConstructorProperties.java @@ -52,6 +52,7 @@ public final class BlobPropertiesInternalConstructorProperties implements BlobPr private final String copyDestinationSnapshot; private final AccessTier accessTier; private final Boolean isAccessTierInferred; + private final AccessTier smartAccessTier; private final ArchiveStatus archiveStatus; private final String encryptionKeySha256; private final String encryptionScope; @@ -129,9 +130,10 @@ public BlobPropertiesInternalConstructorProperties(final OffsetDateTime creation final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, - final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, + final Map metadata, final Integer committedBlockCount, final Long tagCount, + final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn, @@ -162,6 +164,7 @@ public BlobPropertiesInternalConstructorProperties(final OffsetDateTime creation this.copyDestinationSnapshot = copyDestinationSnapshot; this.accessTier = accessTier; this.isAccessTierInferred = isAccessTierInferred; + this.smartAccessTier = smartAccessTier; this.archiveStatus = archiveStatus; this.encryptionKeySha256 = encryptionKeySha256; this.encryptionScope = encryptionScope; @@ -241,9 +244,10 @@ public BlobPropertiesInternalConstructorProperties(final OffsetDateTime creation final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, - final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, + final Map metadata, final Integer committedBlockCount, final Long tagCount, + final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn, @@ -274,6 +278,7 @@ public BlobPropertiesInternalConstructorProperties(final OffsetDateTime creation this.copyDestinationSnapshot = copyDestinationSnapshot; this.accessTier = accessTier; this.isAccessTierInferred = isAccessTierInferred; + this.smartAccessTier = smartAccessTier; this.archiveStatus = archiveStatus; this.encryptionKeySha256 = encryptionKeySha256; this.encryptionScope = encryptionScope; @@ -424,6 +429,11 @@ public Boolean isAccessTierInferred() { return isAccessTierInferred; } + @Override + public AccessTier getSmartAccessTier() { + return smartAccessTier; + } + @Override public ArchiveStatus getArchiveStatus() { return archiveStatus; diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalDownload.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalDownload.java index ca1a582220ba..7b87651a3e25 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalDownload.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalDownload.java @@ -166,6 +166,11 @@ public Boolean isAccessTierInferred() { return null; } + @Override + public AccessTier getSmartAccessTier() { + return null; + } + @Override public ArchiveStatus getArchiveStatus() { return null; diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalGetProperties.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalGetProperties.java index f4de3908d17d..593b4423ec84 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalGetProperties.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalGetProperties.java @@ -165,6 +165,11 @@ public Boolean isAccessTierInferred() { return headers.isXMsAccessTierInferred(); } + @Override + public AccessTier getSmartAccessTier() { + return AccessTier.fromString(headers.getXMsSmartAccessTier()); + } + @Override public ArchiveStatus getArchiveStatus() { return ArchiveStatus.fromString(headers.getXMsArchiveStatus()); diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java index b62ecc33861a..1763f67320c8 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java @@ -83,15 +83,15 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - final OffsetDateTime accessTierChangeTime, final Map metadata, + final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, final Integer committedBlockCount) { this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, - encryptionKeySha256, null, accessTierChangeTime, metadata, committedBlockCount, null, null, null, null, - null); + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, + archiveStatus, encryptionKeySha256, null, accessTierChangeTime, metadata, committedBlockCount, null, null, + null, null, null); } /** @@ -148,16 +148,18 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, - final Integer committedBlockCount, final String versionId, final Boolean isCurrentVersion, final Long tagCount, - Map objectReplicationStatus, final String rehydratePriority, final Boolean isSealed) { + final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, + final Map metadata, final Integer committedBlockCount, final String versionId, + final Boolean isCurrentVersion, final Long tagCount, Map objectReplicationStatus, + final String rehydratePriority, final Boolean isSealed) { this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, - encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, tagCount, - versionId, isCurrentVersion, ModelHelper.getObjectReplicationSourcePolicies(objectReplicationStatus), + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, + archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, + tagCount, versionId, isCurrentVersion, + ModelHelper.getObjectReplicationSourcePolicies(objectReplicationStatus), ModelHelper.getObjectReplicationDestinationPolicyId(objectReplicationStatus), RehydratePriority.fromString(rehydratePriority), isSealed, null, null); } @@ -215,17 +217,18 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, - final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, String encryptionScope, final OffsetDateTime accessTierChangeTime, + final Map metadata, final Integer committedBlockCount, final Long tagCount, + final String versionId, final Boolean isCurrentVersion, List objectReplicationSourcePolicies, String objectReplicationDestinationPolicyId) { this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, - encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, tagCount, - versionId, isCurrentVersion, objectReplicationSourcePolicies, objectReplicationDestinationPolicyId, null, - null, null, null); + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, + archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, + tagCount, versionId, isCurrentVersion, objectReplicationSourcePolicies, + objectReplicationDestinationPolicyId, null, null, null, null); } /** @@ -285,19 +288,21 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, - final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, + final Map metadata, final Integer committedBlockCount, final Long tagCount, + final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn) { this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, - encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, tagCount, - versionId, isCurrentVersion, objectReplicationSourcePolicies, objectReplicationDestinationPolicyId, - rehydratePriority, isSealed, lastAccessedTime, expiresOn, null, false); + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, + archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, + tagCount, versionId, isCurrentVersion, objectReplicationSourcePolicies, + objectReplicationDestinationPolicyId, rehydratePriority, isSealed, lastAccessedTime, expiresOn, null, + false); } /** @@ -359,9 +364,10 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, - final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, + final Map metadata, final Integer committedBlockCount, final Long tagCount, + final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn, @@ -369,10 +375,11 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, - encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, tagCount, - versionId, isCurrentVersion, objectReplicationSourcePolicies, objectReplicationDestinationPolicyId, - rehydratePriority, isSealed, lastAccessedTime, expiresOn, immutabilityPolicy, hasLegalHold, null); + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, + archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, + tagCount, versionId, isCurrentVersion, objectReplicationSourcePolicies, + objectReplicationDestinationPolicyId, rehydratePriority, isSealed, lastAccessedTime, expiresOn, + immutabilityPolicy, hasLegalHold, null); } /** @@ -406,6 +413,7 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la * @param accessTier Access tier of the blob. * @param isAccessTierInferred Flag indicating if the access tier of the blob was inferred from properties of the * blob. + * @param smartAccessTier The inferred smart access tier of the blob. * @param archiveStatus Archive status of the blob. * @param encryptionKeySha256 SHA256 of the customer provided encryption key used to encrypt the blob on the * server. @@ -435,9 +443,10 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, - final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, + final Map metadata, final Integer committedBlockCount, final Long tagCount, + final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn, @@ -446,10 +455,10 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, isIncrementalCopy, copyDestinationSnapshot, - accessTier, isAccessTierInferred, archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, - metadata, committedBlockCount, tagCount, versionId, isCurrentVersion, objectReplicationSourcePolicies, - objectReplicationDestinationPolicyId, rehydratePriority, isSealed, lastAccessedTime, expiresOn, - immutabilityPolicy, hasLegalHold, requestId)); + accessTier, isAccessTierInferred, smartAccessTier, archiveStatus, encryptionKeySha256, encryptionScope, + accessTierChangeTime, metadata, committedBlockCount, tagCount, versionId, isCurrentVersion, + objectReplicationSourcePolicies, objectReplicationDestinationPolicyId, rehydratePriority, isSealed, + lastAccessedTime, expiresOn, immutabilityPolicy, hasLegalHold, requestId)); } /** @@ -697,6 +706,16 @@ public Boolean isAccessTierInferred() { return internalProperties.isAccessTierInferred(); } + /** + * Gets the smart access tier of the blob. + * + * @return the tier of the blob. This is only set for Page blobs on a premium storage account or for Block blobs on + * blob storage or general purpose V2 account. + */ + public AccessTier getSmartAccessTier() { + return internalProperties.getSmartAccessTier(); + } + /** * Gets the archive status of the blob. * diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/Transforms.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/Transforms.java index e1b8bb6fa3bc..844487b09fbd 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/Transforms.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/Transforms.java @@ -341,7 +341,8 @@ static PathProperties toPathProperties(BlobProperties properties, Response r) Transforms.toDataLakeCopyStatusType(properties.getCopyStatus()), properties.getCopySource(), properties.getCopyProgress(), properties.getCopyCompletionTime(), properties.getCopyStatusDescription(), properties.isServerEncrypted(), properties.isIncrementalCopy(), - Transforms.toDataLakeAccessTier(properties.getAccessTier()), + Transforms.toDataLakeAccessTier(properties.getAccessTier()), properties.isAccessTierInferred(), + Transforms.toDataLakeAccessTier(properties.getSmartAccessTier()), Transforms.toDataLakeArchiveStatus(properties.getArchiveStatus()), properties.getEncryptionKeySha256(), properties.getAccessTierChangeTime(), properties.getMetadata(), properties.getExpiresOn()); diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java index 65122071f495..0904dbeeba27 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java @@ -98,19 +98,19 @@ public class PathProperties { * pass {@code null}. */ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime lastModified, final String eTag, - final long fileSize, final String contentType, final byte[] contentMd5, final String contentEncoding, - final String contentDisposition, final String contentLanguage, final String cacheControl, - final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, - final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, - final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, - final Boolean isIncrementalCopy, final AccessTier accessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, - final Map metadata, boolean accessTierInferred, AccessTier smartAccessTier) { + final long fileSize, final String contentType, final byte[] contentMd5, final String contentEncoding, + final String contentDisposition, final String contentLanguage, final String cacheControl, + final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, + final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, + final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, + final Boolean isIncrementalCopy, final AccessTier accessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, + boolean accessTierInferred, AccessTier smartAccessTier) { this(creationTime, lastModified, eTag, fileSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, - copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, isIncrementalCopy, accessTier - , accessTierInferred, smartAccessTier, - archiveStatus, encryptionKeySha256, accessTierChangeTime, metadata, null); + copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, isIncrementalCopy, accessTier, + accessTierInferred, smartAccessTier, archiveStatus, encryptionKeySha256, accessTierChangeTime, metadata, + null); } /** @@ -146,14 +146,14 @@ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime la * @param expiresOn the time when the path is going to expire. */ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime lastModified, final String eTag, - final long fileSize, final String contentType, final byte[] contentMd5, final String contentEncoding, - final String contentDisposition, final String contentLanguage, final String cacheControl, - final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, - final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, - final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, - final Boolean isIncrementalCopy, final AccessTier accessTier, boolean accessTierInferred, AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, - final OffsetDateTime expiresOn) { + final long fileSize, final String contentType, final byte[] contentMd5, final String contentEncoding, + final String contentDisposition, final String contentLanguage, final String cacheControl, + final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, + final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, + final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, + final Boolean isIncrementalCopy, final AccessTier accessTier, boolean accessTierInferred, + AccessTier smartAccessTier, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final OffsetDateTime accessTierChangeTime, final Map metadata, final OffsetDateTime expiresOn) { this.creationTime = creationTime; this.lastModified = lastModified; this.eTag = eTag; @@ -437,7 +437,7 @@ public OffsetDateTime getAccessTierChangeTime() { * * @return the tier of the path. */ - public AccessTier getSmartAccessTier(){ + public AccessTier getSmartAccessTier() { return smartAccessTier; } From 3c5fb20acedb61ce03fec94e67871cdd016f1a9c Mon Sep 17 00:00:00 2001 From: browndav Date: Fri, 13 Mar 2026 12:56:09 -0400 Subject: [PATCH 11/20] changed boolean to Boolean to allow for null --- .../file/datalake/models/PathProperties.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java index 0904dbeeba27..36dd7fe9f5d4 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java @@ -37,7 +37,7 @@ public class PathProperties { private final Boolean isServerEncrypted; private final Boolean isIncrementalCopy; private final AccessTier accessTier; - private final boolean accessTierInferred; + private final Boolean accessTierInferred; private final AccessTier smartAccessTier; private final ArchiveStatus archiveStatus; private final String encryptionKeySha256; @@ -105,7 +105,7 @@ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime la final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final AccessTier accessTier, final ArchiveStatus archiveStatus, final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, - boolean accessTierInferred, AccessTier smartAccessTier) { + final Boolean accessTierInferred, final AccessTier smartAccessTier) { this(creationTime, lastModified, eTag, fileSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, isIncrementalCopy, accessTier, @@ -151,8 +151,8 @@ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime la final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, - final Boolean isIncrementalCopy, final AccessTier accessTier, boolean accessTierInferred, - AccessTier smartAccessTier, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final Boolean isIncrementalCopy, final AccessTier accessTier, final Boolean accessTierInferred, + final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, final OffsetDateTime expiresOn) { this.creationTime = creationTime; this.lastModified = lastModified; @@ -399,9 +399,10 @@ public AccessTier getAccessTier() { /** * Gets whether the access tier of the path was inferred by the service. * - * @return whether the access tier of the path was inferred by the service. + * @return whether the access tier of the path was inferred by the service, or {@code null} when the service does + * not return an inferred value, such as for Smart tier blobs. */ - public boolean isAccessTierInferred() { + public Boolean isAccessTierInferred() { return accessTierInferred; } From 89e946e52c7d5f27b2bd792525c7b75fa2f1ae3a Mon Sep 17 00:00:00 2001 From: browndav Date: Fri, 13 Mar 2026 12:57:14 -0400 Subject: [PATCH 12/20] add premiumDataLakeServiceClient for smart tier --- .../java/com/azure/storage/file/datalake/DataLakeTestBase.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DataLakeTestBase.java b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DataLakeTestBase.java index e24e61c41b6d..67141ddd4388 100644 --- a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DataLakeTestBase.java +++ b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DataLakeTestBase.java @@ -126,6 +126,7 @@ public class DataLakeTestBase extends TestProxyTestBase { protected DataLakeFileSystemAsyncClient dataLakeFileSystemAsyncClient; protected DataLakeServiceClient primaryDataLakeServiceClient; protected DataLakeServiceAsyncClient primaryDataLakeServiceAsyncClient; + protected DataLakeServiceClient premiumDataLakeServiceClient; protected String fileSystemName; protected int entityNo = 0; @@ -155,6 +156,7 @@ public void beforeTest() { .setIgnoredQueryParameters(Arrays.asList("sv")))); primaryDataLakeServiceClient = getServiceClient(ENVIRONMENT.getDataLakeAccount()); + premiumDataLakeServiceClient = getServiceClient(ENVIRONMENT.getPremiumFileAccount()); primaryDataLakeServiceAsyncClient = getServiceAsyncClient(ENVIRONMENT.getDataLakeAccount()); fileSystemName = generateFileSystemName(); From 48425f71ae9deb69aa8cd91cfd93c458d0c96657 Mon Sep 17 00:00:00 2001 From: browndav Date: Fri, 13 Mar 2026 13:06:00 -0400 Subject: [PATCH 13/20] remove code to test access tier smart on get props for datalake @Test @RequiredServiceVersion(clazz = DataLakeServiceVersion.class, min = "2026-02-04") public void getInferredTierWhenAssignedSmart() { // Arrange // Create a file in a file system with the smart tiering feature enabled, and set the access tier to smart. // Did this manually to prove feature works fc = premiumDataLakeServiceClient.getFileSystemClient("5333bf800setblobaccesstiersmart26f99030889cd17d8581") .getFileClient("5333bf801setblobaccesstiersmart26f71508c0c760a5e356"); Response response = fc.getPropertiesWithResponse(null, null, null); HttpHeaders headers = response.getHeaders(); PathProperties properties = response.getValue(); validateBasicHeaders(headers); assertEquals(AccessTier.SMART, properties.getAccessTier()); assertEquals(AccessTier.HOT, properties.getSmartAccessTier()); } --- .../azure/storage/file/datalake/FileApiTest.java | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileApiTest.java b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileApiTest.java index bf9d2631a3bd..db4f76d5ea54 100644 --- a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileApiTest.java +++ b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/FileApiTest.java @@ -1042,22 +1042,6 @@ public void getPropertiesDefault() { assertFalse(properties.isDirectory()); } - @Test - @RequiredServiceVersion(clazz = DataLakeServiceVersion.class, min = "2026-02-04") - public void getInferredTierWhenAssignedSmart() { - // Arrange - // fc already has a created file - - Response response = fc.getPropertiesWithResponse(null, null, null); - HttpHeaders headers = response.getHeaders(); - PathProperties properties = response.getValue(); - - validateBasicHeaders(headers); - - assertTrue(properties.isAccessTierInferred()); - assertEquals(AccessTier.SMART, properties.getSmartAccessTier()); - } - @Test public void getPropertiesMin() { assertEquals(200, fc.getPropertiesWithResponse(null, null, null).getStatusCode()); From 9a5344af1854dfff7714f9340174f08a79668cf8 Mon Sep 17 00:00:00 2001 From: browndav Date: Fri, 13 Mar 2026 13:41:00 -0400 Subject: [PATCH 14/20] add params for smartAccessTier to javadocs --- .../java/com/azure/storage/blob/models/BlobProperties.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java index 1763f67320c8..aee5d9d0a983 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java @@ -67,6 +67,7 @@ private BlobProperties(BlobPropertiesInternal internalProperties) { * @param accessTier Access tier of the blob. * @param isAccessTierInferred Flag indicating if the access tier of the blob was inferred from properties of the * blob. + * @param smartAccessTier The inferred smart access tier of the blob. * @param archiveStatus Archive status of the blob. * @param encryptionKeySha256 SHA256 of the customer provided encryption key used to encrypt the blob on the * server. @@ -125,6 +126,7 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la * @param accessTier Access tier of the blob. * @param isAccessTierInferred Flag indicating if the access tier of the blob was inferred from properties of the * blob. + * @param smartAccessTier The inferred smart access tier of the blob. * @param archiveStatus Archive status of the blob. * @param encryptionKeySha256 SHA256 of the customer provided encryption key used to encrypt the blob on the * server. @@ -195,6 +197,7 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la * @param accessTier Access tier of the blob. * @param isAccessTierInferred Flag indicating if the access tier of the blob was inferred from properties of the * blob. + * @param smartAccessTier The inferred smart access tier of the blob. * @param archiveStatus Archive status of the blob. * @param encryptionKeySha256 SHA256 of the customer provided encryption key used to encrypt the blob on the * server. @@ -262,6 +265,7 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la * @param accessTier Access tier of the blob. * @param isAccessTierInferred Flag indicating if the access tier of the blob was inferred from properties of the * blob. + * @param smartAccessTier The inferred smart access tier of the blob. * @param archiveStatus Archive status of the blob. * @param encryptionKeySha256 SHA256 of the customer provided encryption key used to encrypt the blob on the * server. @@ -336,6 +340,7 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la * @param accessTier Access tier of the blob. * @param isAccessTierInferred Flag indicating if the access tier of the blob was inferred from properties of the * blob. + * @param smartAccessTier The inferred smart access tier of the blob. * @param archiveStatus Archive status of the blob. * @param encryptionKeySha256 SHA256 of the customer provided encryption key used to encrypt the blob on the * server. From 3be75889af6fb71e8dbf588f62819fafa7a223ee Mon Sep 17 00:00:00 2001 From: Isabelle Date: Sun, 15 Mar 2026 12:29:04 -0700 Subject: [PATCH 15/20] removing breaking changes --- .../BlobPropertiesConstructorProxy.java | 4 +- .../models/BlobPropertiesInternal.java | 4 + ...opertiesInternalConstructorProperties.java | 19 +-- .../blob/models/BlobItemProperties.java | 20 +++ .../storage/blob/models/BlobProperties.java | 97 ++++++-------- .../com/azure/storage/blob/BlobApiTests.java | 14 ++ .../blob/specialized/BlobBaseApiTests.java | 123 +++++++++++++++++- 7 files changed, 208 insertions(+), 73 deletions(-) diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/accesshelpers/BlobPropertiesConstructorProxy.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/accesshelpers/BlobPropertiesConstructorProxy.java index 3a1bd6543362..48f9b8e09d0d 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/accesshelpers/BlobPropertiesConstructorProxy.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/accesshelpers/BlobPropertiesConstructorProxy.java @@ -30,7 +30,7 @@ public interface BlobPropertiesConstructorAccessor { } /** - * The method called from the static initializer of {@link BlobProperties} to set it's accessor. + * The method called from the static initializer of {@link BlobProperties} to set its accessor. * * @param accessor The {@link BlobProperties} accessor. */ @@ -51,7 +51,7 @@ public static BlobProperties create(BlobPropertiesInternal internalProperties) { // is null this effectively pokes the class to set up the accessor. if (accessor == null) { new BlobProperties(null, null, null, 0, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); + null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null); } assert accessor != null; diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternal.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternal.java index f90cf0485a4b..ed876af758d7 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternal.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternal.java @@ -171,6 +171,10 @@ public interface BlobPropertiesInternal { */ Boolean isAccessTierInferred(); + /** + * @return the tier of the blob. This is only set for Page blobs on a premium storage account or for Block blobs on + * blob storage or general purpose V2 account. + */ AccessTier getSmartAccessTier(); /** diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalConstructorProperties.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalConstructorProperties.java index 7404af040770..3c3a8cc26d52 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalConstructorProperties.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/implementation/models/BlobPropertiesInternalConstructorProperties.java @@ -52,7 +52,6 @@ public final class BlobPropertiesInternalConstructorProperties implements BlobPr private final String copyDestinationSnapshot; private final AccessTier accessTier; private final Boolean isAccessTierInferred; - private final AccessTier smartAccessTier; private final ArchiveStatus archiveStatus; private final String encryptionKeySha256; private final String encryptionScope; @@ -130,10 +129,9 @@ public BlobPropertiesInternalConstructorProperties(final OffsetDateTime creation final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, - final Map metadata, final Integer committedBlockCount, final Long tagCount, - final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, + final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn, @@ -164,7 +162,6 @@ public BlobPropertiesInternalConstructorProperties(final OffsetDateTime creation this.copyDestinationSnapshot = copyDestinationSnapshot; this.accessTier = accessTier; this.isAccessTierInferred = isAccessTierInferred; - this.smartAccessTier = smartAccessTier; this.archiveStatus = archiveStatus; this.encryptionKeySha256 = encryptionKeySha256; this.encryptionScope = encryptionScope; @@ -244,10 +241,9 @@ public BlobPropertiesInternalConstructorProperties(final OffsetDateTime creation final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, - final Map metadata, final Integer committedBlockCount, final Long tagCount, - final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, + final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn, @@ -278,7 +274,6 @@ public BlobPropertiesInternalConstructorProperties(final OffsetDateTime creation this.copyDestinationSnapshot = copyDestinationSnapshot; this.accessTier = accessTier; this.isAccessTierInferred = isAccessTierInferred; - this.smartAccessTier = smartAccessTier; this.archiveStatus = archiveStatus; this.encryptionKeySha256 = encryptionKeySha256; this.encryptionScope = encryptionScope; @@ -431,7 +426,7 @@ public Boolean isAccessTierInferred() { @Override public AccessTier getSmartAccessTier() { - return smartAccessTier; + return null; } @Override diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItemProperties.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItemProperties.java index 68a6247e304f..ccd3b89a3f5b 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItemProperties.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobItemProperties.java @@ -608,6 +608,26 @@ public BlobItemProperties setAccessTierInferred(Boolean accessTierInferred) { return this; } + /** + * Get the smartAccessTier property: The smartAccessTier property. + * + * @return the smartAccessTier value. + */ + public AccessTier getSmartAccessTier() { + return internalProperties.getSmartAccessTier(); + } + + /** + * Set the smartAccessTier property: The smartAccessTier property. + * + * @param smartAccessTier the smartAccessTier value to set. + * @return the BlobItemProperties object itself. + */ + public BlobItemProperties setSmartAccessTier(AccessTier smartAccessTier) { + internalProperties.setSmartAccessTier(smartAccessTier); + return this; + } + /** * Get the archiveStatus property: Possible values include: 'rehydrate-pending-to-hot', * 'rehydrate-pending-to-cool'. diff --git a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java index 1763f67320c8..1459820c0253 100644 --- a/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java +++ b/sdk/storage/azure-storage-blob/src/main/java/com/azure/storage/blob/models/BlobProperties.java @@ -23,13 +23,7 @@ public final class BlobProperties { private final BlobPropertiesInternal internalProperties; static { - BlobPropertiesConstructorProxy - .setAccessor(new BlobPropertiesConstructorProxy.BlobPropertiesConstructorAccessor() { - @Override - public BlobProperties create(BlobPropertiesInternal internalProperties) { - return new BlobProperties(internalProperties); - } - }); + BlobPropertiesConstructorProxy.setAccessor(BlobProperties::new); } private BlobProperties(BlobPropertiesInternal internalProperties) { @@ -83,15 +77,15 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, + final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final OffsetDateTime accessTierChangeTime, final Map metadata, final Integer committedBlockCount) { this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, - archiveStatus, encryptionKeySha256, null, accessTierChangeTime, metadata, committedBlockCount, null, null, - null, null, null); + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, + encryptionKeySha256, null, accessTierChangeTime, metadata, committedBlockCount, null, null, null, null, + null); } /** @@ -148,18 +142,16 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, - final Map metadata, final Integer committedBlockCount, final String versionId, - final Boolean isCurrentVersion, final Long tagCount, Map objectReplicationStatus, - final String rehydratePriority, final Boolean isSealed) { + final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, + final Integer committedBlockCount, final String versionId, final Boolean isCurrentVersion, final Long tagCount, + Map objectReplicationStatus, final String rehydratePriority, final Boolean isSealed) { this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, - archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, - tagCount, versionId, isCurrentVersion, - ModelHelper.getObjectReplicationSourcePolicies(objectReplicationStatus), + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, + encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, tagCount, + versionId, isCurrentVersion, ModelHelper.getObjectReplicationSourcePolicies(objectReplicationStatus), ModelHelper.getObjectReplicationDestinationPolicyId(objectReplicationStatus), RehydratePriority.fromString(rehydratePriority), isSealed, null, null); } @@ -217,18 +209,17 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, String encryptionScope, final OffsetDateTime accessTierChangeTime, - final Map metadata, final Integer committedBlockCount, final Long tagCount, - final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, + final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, List objectReplicationSourcePolicies, String objectReplicationDestinationPolicyId) { this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, - archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, - tagCount, versionId, isCurrentVersion, objectReplicationSourcePolicies, - objectReplicationDestinationPolicyId, null, null, null, null); + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, + encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, tagCount, + versionId, isCurrentVersion, objectReplicationSourcePolicies, objectReplicationDestinationPolicyId, null, + null, null, null); } /** @@ -288,21 +279,19 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, - final Map metadata, final Integer committedBlockCount, final Long tagCount, - final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, + final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn) { this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, - archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, - tagCount, versionId, isCurrentVersion, objectReplicationSourcePolicies, - objectReplicationDestinationPolicyId, rehydratePriority, isSealed, lastAccessedTime, expiresOn, null, - false); + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, + encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, tagCount, + versionId, isCurrentVersion, objectReplicationSourcePolicies, objectReplicationDestinationPolicyId, + rehydratePriority, isSealed, lastAccessedTime, expiresOn, null, false); } /** @@ -364,10 +353,9 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, - final Map metadata, final Integer committedBlockCount, final Long tagCount, - final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, + final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn, @@ -375,11 +363,10 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la this(creationTime, lastModified, eTag, blobSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, - isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, smartAccessTier, - archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, - tagCount, versionId, isCurrentVersion, objectReplicationSourcePolicies, - objectReplicationDestinationPolicyId, rehydratePriority, isSealed, lastAccessedTime, expiresOn, - immutabilityPolicy, hasLegalHold, null); + isIncrementalCopy, copyDestinationSnapshot, accessTier, isAccessTierInferred, archiveStatus, + encryptionKeySha256, encryptionScope, accessTierChangeTime, metadata, committedBlockCount, tagCount, + versionId, isCurrentVersion, objectReplicationSourcePolicies, objectReplicationDestinationPolicyId, + rehydratePriority, isSealed, lastAccessedTime, expiresOn, immutabilityPolicy, hasLegalHold, null); } /** @@ -413,7 +400,6 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la * @param accessTier Access tier of the blob. * @param isAccessTierInferred Flag indicating if the access tier of the blob was inferred from properties of the * blob. - * @param smartAccessTier The inferred smart access tier of the blob. * @param archiveStatus Archive status of the blob. * @param encryptionKeySha256 SHA256 of the customer provided encryption key used to encrypt the blob on the * server. @@ -443,10 +429,9 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final String copyDestinationSnapshot, final AccessTier accessTier, - final Boolean isAccessTierInferred, final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final String encryptionScope, final OffsetDateTime accessTierChangeTime, - final Map metadata, final Integer committedBlockCount, final Long tagCount, - final String versionId, final Boolean isCurrentVersion, + final Boolean isAccessTierInferred, final ArchiveStatus archiveStatus, final String encryptionKeySha256, + final String encryptionScope, final OffsetDateTime accessTierChangeTime, final Map metadata, + final Integer committedBlockCount, final Long tagCount, final String versionId, final Boolean isCurrentVersion, final List objectReplicationSourcePolicies, final String objectReplicationDestinationPolicyId, final RehydratePriority rehydratePriority, final Boolean isSealed, final OffsetDateTime lastAccessedTime, final OffsetDateTime expiresOn, @@ -455,10 +440,10 @@ public BlobProperties(final OffsetDateTime creationTime, final OffsetDateTime la contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, blobSequenceNumber, blobType, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, isIncrementalCopy, copyDestinationSnapshot, - accessTier, isAccessTierInferred, smartAccessTier, archiveStatus, encryptionKeySha256, encryptionScope, - accessTierChangeTime, metadata, committedBlockCount, tagCount, versionId, isCurrentVersion, - objectReplicationSourcePolicies, objectReplicationDestinationPolicyId, rehydratePriority, isSealed, - lastAccessedTime, expiresOn, immutabilityPolicy, hasLegalHold, requestId)); + accessTier, isAccessTierInferred, archiveStatus, encryptionKeySha256, encryptionScope, accessTierChangeTime, + metadata, committedBlockCount, tagCount, versionId, isCurrentVersion, objectReplicationSourcePolicies, + objectReplicationDestinationPolicyId, rehydratePriority, isSealed, lastAccessedTime, expiresOn, + immutabilityPolicy, hasLegalHold, requestId)); } /** diff --git a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/BlobApiTests.java b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/BlobApiTests.java index fe1b4affa3a5..50a9eb63ef21 100644 --- a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/BlobApiTests.java +++ b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/BlobApiTests.java @@ -3225,4 +3225,18 @@ void containerNameEncodingOnGetBlobUrl() { assertTrue(blobClient.getBlobUrl().contains(expectedEncodedContainerName)); } + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @Test + public void uploadStreamAccessTierSmart() { + bc = cc.getBlobClient(generateBlobName()); + InputStream data = new ByteArrayInputStream(getRandomByteArray(Constants.KB)); + + BlobParallelUploadOptions options = new BlobParallelUploadOptions(data).setTier(AccessTier.SMART); + bc.uploadWithResponse(options, null, Context.NONE); + + Response response = bc.getPropertiesWithResponse(null, null, Context.NONE); + assertEquals(AccessTier.SMART, response.getValue().getAccessTier()); + assertNotNull(response.getValue().getSmartAccessTier()); + } + } diff --git a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/specialized/BlobBaseApiTests.java b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/specialized/BlobBaseApiTests.java index 4e0766c4a296..7bb4be87dd5c 100644 --- a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/specialized/BlobBaseApiTests.java +++ b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/specialized/BlobBaseApiTests.java @@ -3,10 +3,17 @@ package com.azure.storage.blob.specialized; +import com.azure.core.http.rest.Response; import com.azure.core.test.utils.TestUtils; +import com.azure.core.util.Context; +import com.azure.core.util.polling.PollResponse; import com.azure.storage.blob.BlobClient; +import com.azure.storage.blob.BlobClientBuilder; import com.azure.storage.blob.BlobServiceVersion; import com.azure.storage.blob.BlobTestBase; +import com.azure.storage.blob.models.AccessTier; +import com.azure.storage.blob.models.BlobCopyInfo; +import com.azure.storage.blob.models.BlobProperties; import com.azure.storage.blob.models.BlobQueryArrowField; import com.azure.storage.blob.models.BlobQueryArrowFieldType; import com.azure.storage.blob.models.BlobQueryArrowSerialization; @@ -18,7 +25,13 @@ import com.azure.storage.blob.models.BlobQuerySerialization; import com.azure.storage.blob.models.BlobRequestConditions; import com.azure.storage.blob.models.BlobStorageException; +import com.azure.storage.blob.models.RehydratePriority; +import com.azure.storage.blob.options.BlobBeginCopyOptions; +import com.azure.storage.blob.options.BlobCopyFromUrlOptions; import com.azure.storage.blob.options.BlobQueryOptions; +import com.azure.storage.blob.options.BlobSetAccessTierOptions; +import com.azure.storage.blob.sas.BlobSasPermission; +import com.azure.storage.blob.sas.BlobServiceSasSignatureValues; import com.azure.storage.common.implementation.Constants; import com.azure.storage.common.test.shared.extensions.LiveOnly; import com.azure.storage.common.test.shared.extensions.RequiredServiceVersion; @@ -45,9 +58,11 @@ import java.util.function.Consumer; import java.util.stream.Stream; +import static com.azure.storage.blob.models.ArchiveStatus.REHYDRATE_PENDING_TO_SMART; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; @@ -595,7 +610,7 @@ public void queryMultipleRecordsWithProgressReceiver() { } long temp = 0; - // Make sure theyre all increasingly bigger + // Make sure they're all increasingly bigger for (long progress : mockReceiver.progressList) { assertTrue(progress >= temp); temp = progress; @@ -608,7 +623,7 @@ public void queryMultipleRecordsWithProgressReceiver() { = new BlobQueryOptions(expression, new ByteArrayOutputStream()).setProgressConsumer(mockReceiver2); bc.queryWithResponse(options2, null, null); - // Make sure theyre all increasingly bigger + // Make sure they're all increasingly bigger for (long progress : mockReceiver2.progressList) { assertTrue(progress >= temp); temp = progress; @@ -812,7 +827,7 @@ public void copyFromURLSourceErrorAndStatusCode() { BlobStorageException e = assertThrows(BlobStorageException.class, () -> destBlob.copyFromUrl(bc.getBlobUrl())); - assertTrue(e.getStatusCode() == 401); + assertEquals(401, e.getStatusCode()); assertTrue(e.getServiceMessage().contains("NoAuthenticationInformation")); assertTrue(e.getServiceMessage() .contains( @@ -820,6 +835,108 @@ public void copyFromURLSourceErrorAndStatusCode() { } + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @Test + public void startCopyFromURLSmartAccessTier() { + BlockBlobClient destBlob = cc.getBlobClient(generateBlobName()).getBlockBlobClient(); + + BlobBeginCopyOptions options = new BlobBeginCopyOptions(bc.getBlobUrl()).setTier(AccessTier.SMART); + + PollResponse operation = destBlob.beginCopy(options).waitForCompletion(); + assertTrue(operation.getStatus().isComplete()); + + Response response = destBlob.getPropertiesWithResponse(null, null, Context.NONE); + assertEquals(AccessTier.SMART, response.getValue().getAccessTier()); + assertNotNull(response.getValue().getSmartAccessTier()); + } + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @Test + public void copyFromURLSmartAccessTier() { + String srcBlobSas = bc.generateSas(new BlobServiceSasSignatureValues(OffsetDateTime.now().plusHours(1), + new BlobSasPermission().setReadPermission(true))); + bc = new BlobClientBuilder().endpoint(bc.getBlobUrl()).sasToken(srcBlobSas).buildClient(); + BlockBlobClient destBlob = cc.getBlobClient(generateBlobName()).getBlockBlobClient(); + + BlobCopyFromUrlOptions options + = new BlobCopyFromUrlOptions(bc.getBlobUrl() + "?" + srcBlobSas).setTier(AccessTier.SMART); + + destBlob.copyFromUrlWithResponse(options, null, Context.NONE); + + Response response = destBlob.getPropertiesWithResponse(null, null, Context.NONE); + assertEquals(AccessTier.SMART, response.getValue().getAccessTier()); + assertNotNull(response.getValue().getSmartAccessTier()); + } + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @Test + public void setTierSmart() { + bc.setAccessTier(AccessTier.SMART); + + Response response = bc.getPropertiesWithResponse(null, null, Context.NONE); + assertEquals(AccessTier.SMART, response.getValue().getAccessTier()); + assertNotNull(response.getValue().getSmartAccessTier()); + } + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @Test + public void setTierSmartGetBlobs() { + String blobName1 = generateBlobName(); + String blobName2 = generateBlobName(); + BlobClient blob1 = cc.getBlobClient(blobName1); + BlobClient blob2 = cc.getBlobClient(blobName2); + blob1.upload(new ByteArrayInputStream(new byte[0]), 0); + blob2.upload(new ByteArrayInputStream(new byte[0]), 0); + + blob1.setAccessTier(AccessTier.SMART); + blob2.setAccessTier(AccessTier.SMART); + + cc.listBlobs().forEach(blobItem -> { + if (blobItem.getName().equals(blobName1) || blobItem.getName().equals(blobName2)) { + assertEquals(AccessTier.SMART, blobItem.getProperties().getAccessTier()); + assertNotNull(blobItem.getProperties().getSmartAccessTier()); + } + }); + } + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @Test + public void setTierSmartRehydrate() { + bc.setAccessTier(AccessTier.ARCHIVE); + + BlobSetAccessTierOptions options + = new BlobSetAccessTierOptions(AccessTier.SMART).setPriority(RehydratePriority.HIGH); + bc.setAccessTierWithResponse(options, null, Context.NONE); + + Response response = bc.getPropertiesWithResponse(null, null, Context.NONE); + assertEquals(REHYDRATE_PENDING_TO_SMART, response.getValue().getArchiveStatus()); + } + + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @Test + public void setTierSmartRehydrateGetBlobs() { + String blobName1 = generateBlobName(); + String blobName2 = generateBlobName(); + BlobClient blob1 = cc.getBlobClient(blobName1); + BlobClient blob2 = cc.getBlobClient(blobName2); + blob1.upload(new ByteArrayInputStream(new byte[0]), 0); + blob2.upload(new ByteArrayInputStream(new byte[0]), 0); + + blob1.setAccessTier(AccessTier.ARCHIVE); + blob2.setAccessTier(AccessTier.ARCHIVE); + + BlobSetAccessTierOptions options + = new BlobSetAccessTierOptions(AccessTier.SMART).setPriority(RehydratePriority.HIGH); + blob1.setAccessTierWithResponse(options, null, Context.NONE); + blob2.setAccessTierWithResponse(options, null, Context.NONE); + + cc.listBlobs().forEach(blobItem -> { + if (blobItem.getName().equals(blobName1) || blobItem.getName().equals(blobName2)) { + assertEquals(REHYDRATE_PENDING_TO_SMART, blobItem.getProperties().getArchiveStatus()); + } + }); + } + static class MockProgressConsumer implements Consumer { List progressList; From 85a4da185e627439ccd9330e35a71a31fd7d4a2b Mon Sep 17 00:00:00 2001 From: Isabelle Date: Sun, 15 Mar 2026 13:19:54 -0700 Subject: [PATCH 16/20] removing datalake breaking changes --- .../storage/file/datalake/Transforms.java | 9 ++-- .../implementation/util/AccessorUtility.java | 4 +- .../file/datalake/models/PathProperties.java | 41 +++++++++---------- .../file/datalake/DataLakeTestBase.java | 1 - 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/Transforms.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/Transforms.java index 844487b09fbd..6ab7e7cc1aec 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/Transforms.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/Transforms.java @@ -130,6 +130,8 @@ class Transforms { static final HttpHeaderName X_MS_PERMISSIONS = HttpHeaderName.fromString("x-ms-permissions"); static final HttpHeaderName X_MS_CONTINUATION = HttpHeaderName.fromString("x-ms-continuation"); static final HttpHeaderName X_MS_ACL = HttpHeaderName.fromString("x-ms-acl"); + static final HttpHeaderName X_MS_ACCESS_TIER_INFERRED = HttpHeaderName.fromString("x-ms-access-tier-inferred"); + static final HttpHeaderName X_MS_SMART_ACCESS_TIER = HttpHeaderName.fromString("x-ms-smart-access-tier"); static { // https://docs.oracle.com/javase/8/docs/api/java/util/Date.html#getTime-- @@ -341,8 +343,7 @@ static PathProperties toPathProperties(BlobProperties properties, Response r) Transforms.toDataLakeCopyStatusType(properties.getCopyStatus()), properties.getCopySource(), properties.getCopyProgress(), properties.getCopyCompletionTime(), properties.getCopyStatusDescription(), properties.isServerEncrypted(), properties.isIncrementalCopy(), - Transforms.toDataLakeAccessTier(properties.getAccessTier()), properties.isAccessTierInferred(), - Transforms.toDataLakeAccessTier(properties.getSmartAccessTier()), + Transforms.toDataLakeAccessTier(properties.getAccessTier()), Transforms.toDataLakeArchiveStatus(properties.getArchiveStatus()), properties.getEncryptionKeySha256(), properties.getAccessTierChangeTime(), properties.getMetadata(), properties.getExpiresOn()); @@ -354,10 +355,12 @@ static PathProperties toPathProperties(BlobProperties properties, Response r) String group = r.getHeaders().getValue(X_MS_GROUP); String permissions = r.getHeaders().getValue(X_MS_PERMISSIONS); String acl = r.getHeaders().getValue(X_MS_ACL); + Boolean accessTierInferred = properties.isAccessTierInferred(); + AccessTier smartAccessTier = Transforms.toDataLakeAccessTier(properties.getSmartAccessTier()); return AccessorUtility.getPathPropertiesAccessor() .setPathProperties(pathProperties, properties.getEncryptionScope(), encryptionContext, owner, group, - permissions, acl); + permissions, acl, accessTierInferred, smartAccessTier); } } } diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/implementation/util/AccessorUtility.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/implementation/util/AccessorUtility.java index befe9687e7f4..e9cf18bb10b1 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/implementation/util/AccessorUtility.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/implementation/util/AccessorUtility.java @@ -3,6 +3,7 @@ package com.azure.storage.file.datalake.implementation.util; +import com.azure.storage.file.datalake.models.AccessTier; import com.azure.storage.file.datalake.models.FileSystemProperties; import com.azure.storage.file.datalake.models.PathItem; import com.azure.storage.file.datalake.models.PathPermissions; @@ -31,7 +32,8 @@ private AccessorUtility() { */ public interface PathPropertiesAccessor { PathProperties setPathProperties(PathProperties properties, String encryptionScope, String encryptionContext, - String owner, String group, String permissions, String acl); + String owner, String group, String permissions, String acl, Boolean accessTierInferred, + AccessTier smartAccessTier); } /** diff --git a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java index 36dd7fe9f5d4..22b1cd725a5b 100644 --- a/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java +++ b/sdk/storage/azure-storage-file-datalake/src/main/java/com/azure/storage/file/datalake/models/PathProperties.java @@ -37,8 +37,6 @@ public class PathProperties { private final Boolean isServerEncrypted; private final Boolean isIncrementalCopy; private final AccessTier accessTier; - private final Boolean accessTierInferred; - private final AccessTier smartAccessTier; private final ArchiveStatus archiveStatus; private final String encryptionKeySha256; private final OffsetDateTime accessTierChangeTime; @@ -51,19 +49,23 @@ public class PathProperties { private String group; private String permissions; private List accessControlList; + private Boolean accessTierInferred; + private AccessTier smartAccessTier; static { - AccessorUtility.setPathPropertiesAccessor( - (properties, encryptionScope, encryptionContext, owner, group, permissions, AccessControlList) -> { - properties.encryptionScope = encryptionScope; - properties.encryptionContext = encryptionContext; - properties.owner = owner; - properties.group = group; - properties.permissions = permissions; - properties.accessControlList = PathAccessControlEntry.parseList(AccessControlList); + AccessorUtility.setPathPropertiesAccessor((properties, encryptionScope, encryptionContext, owner, group, + permissions, AccessControlList, accessTierInferred, smartAccessTier) -> { + properties.encryptionScope = encryptionScope; + properties.encryptionContext = encryptionContext; + properties.owner = owner; + properties.group = group; + properties.permissions = permissions; + properties.accessControlList = PathAccessControlEntry.parseList(AccessControlList); + properties.accessTierInferred = accessTierInferred; + properties.smartAccessTier = smartAccessTier; - return properties; - }); + return properties; + }); } /** @@ -104,13 +106,12 @@ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime la final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, final Boolean isIncrementalCopy, final AccessTier accessTier, final ArchiveStatus archiveStatus, - final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, - final Boolean accessTierInferred, final AccessTier smartAccessTier) { + final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, + final Map metadata) { this(creationTime, lastModified, eTag, fileSize, contentType, contentMd5, contentEncoding, contentDisposition, contentLanguage, cacheControl, leaseStatus, leaseState, leaseDuration, copyId, copyStatus, copySource, copyProgress, copyCompletionTime, copyStatusDescription, isServerEncrypted, isIncrementalCopy, accessTier, - accessTierInferred, smartAccessTier, archiveStatus, encryptionKeySha256, accessTierChangeTime, metadata, - null); + archiveStatus, encryptionKeySha256, accessTierChangeTime, metadata, null); } /** @@ -151,9 +152,9 @@ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime la final LeaseStatusType leaseStatus, final LeaseStateType leaseState, final LeaseDurationType leaseDuration, final String copyId, final CopyStatusType copyStatus, final String copySource, final String copyProgress, final OffsetDateTime copyCompletionTime, final String copyStatusDescription, final Boolean isServerEncrypted, - final Boolean isIncrementalCopy, final AccessTier accessTier, final Boolean accessTierInferred, - final AccessTier smartAccessTier, final ArchiveStatus archiveStatus, final String encryptionKeySha256, - final OffsetDateTime accessTierChangeTime, final Map metadata, final OffsetDateTime expiresOn) { + final Boolean isIncrementalCopy, final AccessTier accessTier, final ArchiveStatus archiveStatus, + final String encryptionKeySha256, final OffsetDateTime accessTierChangeTime, final Map metadata, + final OffsetDateTime expiresOn) { this.creationTime = creationTime; this.lastModified = lastModified; this.eTag = eTag; @@ -176,8 +177,6 @@ public PathProperties(final OffsetDateTime creationTime, final OffsetDateTime la this.isServerEncrypted = isServerEncrypted; this.isIncrementalCopy = isIncrementalCopy; this.accessTier = accessTier; - this.accessTierInferred = accessTierInferred; - this.smartAccessTier = smartAccessTier; this.archiveStatus = archiveStatus; this.encryptionKeySha256 = encryptionKeySha256; this.accessTierChangeTime = accessTierChangeTime; diff --git a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DataLakeTestBase.java b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DataLakeTestBase.java index 67141ddd4388..60ab7b4373c4 100644 --- a/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DataLakeTestBase.java +++ b/sdk/storage/azure-storage-file-datalake/src/test/java/com/azure/storage/file/datalake/DataLakeTestBase.java @@ -156,7 +156,6 @@ public void beforeTest() { .setIgnoredQueryParameters(Arrays.asList("sv")))); primaryDataLakeServiceClient = getServiceClient(ENVIRONMENT.getDataLakeAccount()); - premiumDataLakeServiceClient = getServiceClient(ENVIRONMENT.getPremiumFileAccount()); primaryDataLakeServiceAsyncClient = getServiceAsyncClient(ENVIRONMENT.getDataLakeAccount()); fileSystemName = generateFileSystemName(); From 03c31d95b951f3978f9446937e7b997c6e0809b2 Mon Sep 17 00:00:00 2001 From: browndav Date: Sun, 15 Mar 2026 17:18:23 -0400 Subject: [PATCH 17/20] add recordings for BlobBaseApiTests --- sdk/storage/azure-storage-blob/assets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob/assets.json b/sdk/storage/azure-storage-blob/assets.json index d98b4bc847a7..79d34d14efd2 100644 --- a/sdk/storage/azure-storage-blob/assets.json +++ b/sdk/storage/azure-storage-blob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "java", "TagPrefix": "java/storage/azure-storage-blob", - "Tag": "java/storage/azure-storage-blob_4ab10936db" + "Tag": "java/storage/azure-storage-blob_9834a66f37" } From 8f04fa2c5d6113e9b13b09d91da46a2c4444a144 Mon Sep 17 00:00:00 2001 From: browndav Date: Sun, 15 Mar 2026 17:28:12 -0400 Subject: [PATCH 18/20] add recordings for BlobApiTests#uploadStreamAccessTierSmart --- sdk/storage/azure-storage-blob/assets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob/assets.json b/sdk/storage/azure-storage-blob/assets.json index 79d34d14efd2..120b12ff9975 100644 --- a/sdk/storage/azure-storage-blob/assets.json +++ b/sdk/storage/azure-storage-blob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "java", "TagPrefix": "java/storage/azure-storage-blob", - "Tag": "java/storage/azure-storage-blob_9834a66f37" + "Tag": "java/storage/azure-storage-blob_bad1d20c3f" } From 1c6909f9c863afb9e05e18a9dd59d29a7d660605 Mon Sep 17 00:00:00 2001 From: browndav Date: Sun, 15 Mar 2026 17:46:25 -0400 Subject: [PATCH 19/20] add recordings for BlobAsyncApiTests#uploadStreamAccessTierSmart --- .../azure/storage/blob/BlobAsyncApiTests.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/BlobAsyncApiTests.java b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/BlobAsyncApiTests.java index d80560afb928..0e7bc5476a32 100644 --- a/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/BlobAsyncApiTests.java +++ b/sdk/storage/azure-storage-blob/src/test/java/com/azure/storage/blob/BlobAsyncApiTests.java @@ -13,6 +13,7 @@ import com.azure.core.test.utils.MockTokenCredential; import com.azure.core.test.utils.TestUtils; import com.azure.core.util.BinaryData; +import com.azure.core.util.Context; import com.azure.core.util.CoreUtils; import com.azure.core.util.FluxUtil; import com.azure.core.util.ProgressListener; @@ -88,8 +89,10 @@ import reactor.test.StepVerifier; import reactor.util.function.Tuple2; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.UncheckedIOException; import java.net.URL; import java.nio.ByteBuffer; @@ -2577,6 +2580,36 @@ public void setTierCold() { .verifyComplete(); } + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2026-02-06") + @Test + public void uploadStreamAccessTierSmart() { + + Flux response + = primaryBlobServiceAsyncClient.createBlobContainer(generateContainerName()).flatMapMany(cc -> { + BlockBlobAsyncClient bc = cc.getBlobAsyncClient(generateBlobName()).getBlockBlobAsyncClient(); + return bc.upload(DATA.getDefaultFlux(), DATA.getDefaultData().remaining()) + .then(bc.setAccessTierWithResponse(AccessTier.SMART, null, null)) + .flatMap(r -> { + HttpHeaders headers = r.getHeaders(); + + assertTrue(r.getStatusCode() == 200 || r.getStatusCode() == 202); + assertNotNull(headers.getValue(X_MS_VERSION)); + assertNotNull(headers.getValue(X_MS_REQUEST_ID)); + return Mono.empty(); + }) + .then(bc.getProperties()) + .flatMap(r -> { + assertEquals(AccessTier.SMART, r.getAccessTier()); + return Mono.empty(); + }) + .thenMany(cc.listBlobs()); + }); + + StepVerifier.create(response) + .assertNext(r -> assertEquals(AccessTier.SMART, r.getProperties().getAccessTier())) + .verifyComplete(); + } + @RequiredServiceVersion(clazz = BlobServiceVersion.class, min = "2021-12-02") @Test public void setTierArchiveStatusRehydratePendingToCold() { From 8e5a135b0f567e534161183a2f94e0cf6abd8350 Mon Sep 17 00:00:00 2001 From: browndav Date: Sun, 15 Mar 2026 18:26:31 -0400 Subject: [PATCH 20/20] add recordings for BlobAsyncApiTests#uploadStreamAccessTierSmart --- sdk/storage/azure-storage-blob/assets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/storage/azure-storage-blob/assets.json b/sdk/storage/azure-storage-blob/assets.json index 120b12ff9975..fdbc6cfd11e9 100644 --- a/sdk/storage/azure-storage-blob/assets.json +++ b/sdk/storage/azure-storage-blob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "java", "TagPrefix": "java/storage/azure-storage-blob", - "Tag": "java/storage/azure-storage-blob_bad1d20c3f" + "Tag": "java/storage/azure-storage-blob_0f8f4263e8" }