Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sdk/storage/azure-storage-blob/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
## 12.31.0b1 (Unreleased)

### Features Added
- Added support for service version 2026-10-06.- Added access tier information to the response of `BlobClient`'s `download_blob` API. The `blob_tier`, `blob_tier_inferred`,
`blob_tier_change_time`, and `smart_access_tier` properties are now populated on the downloaded blob's `properties`.

## 12.30.0 (2026-06-08)

Expand Down
2 changes: 1 addition & 1 deletion sdk/storage/azure-storage-blob/assets.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"AssetsRepo": "Azure/azure-sdk-assets",
"AssetsRepoPrefixPath": "python",
"TagPrefix": "python/storage/azure-storage-blob",
"Tag": "python/storage/azure-storage-blob_b09e37b521"
"Tag": "python/storage/azure-storage-blob_b3dfcd80a9"
}
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,16 @@ async def download(
response_headers["x-ms-structured-content-length"] = self._deserialize(
"int", response.headers.get("x-ms-structured-content-length")
)
response_headers["x-ms-access-tier"] = self._deserialize("str", response.headers.get("x-ms-access-tier"))
response_headers["x-ms-access-tier-inferred"] = self._deserialize(
"bool", response.headers.get("x-ms-access-tier-inferred")
)
response_headers["x-ms-access-tier-change-time"] = self._deserialize(
"rfc-1123", response.headers.get("x-ms-access-tier-change-time")
)
response_headers["x-ms-smart-access-tier"] = self._deserialize(
"str", response.headers.get("x-ms-smart-access-tier")
)

if response.status_code == 206:
response_headers["Last-Modified"] = self._deserialize("rfc-1123", response.headers.get("Last-Modified"))
Expand Down Expand Up @@ -393,6 +403,16 @@ async def download(
response_headers["x-ms-structured-content-length"] = self._deserialize(
"int", response.headers.get("x-ms-structured-content-length")
)
response_headers["x-ms-access-tier"] = self._deserialize("str", response.headers.get("x-ms-access-tier"))
response_headers["x-ms-access-tier-inferred"] = self._deserialize(
"bool", response.headers.get("x-ms-access-tier-inferred")
)
response_headers["x-ms-access-tier-change-time"] = self._deserialize(
"rfc-1123", response.headers.get("x-ms-access-tier-change-time")
)
response_headers["x-ms-smart-access-tier"] = self._deserialize(
"str", response.headers.get("x-ms-smart-access-tier")
)

deserialized = response.stream_download(self._client._pipeline, decompress=_decompress)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1775,6 +1775,16 @@ def download(
response_headers["x-ms-structured-content-length"] = self._deserialize(
"int", response.headers.get("x-ms-structured-content-length")
)
response_headers["x-ms-access-tier"] = self._deserialize("str", response.headers.get("x-ms-access-tier"))
response_headers["x-ms-access-tier-inferred"] = self._deserialize(
"bool", response.headers.get("x-ms-access-tier-inferred")
)
response_headers["x-ms-access-tier-change-time"] = self._deserialize(
"rfc-1123", response.headers.get("x-ms-access-tier-change-time")
)
response_headers["x-ms-smart-access-tier"] = self._deserialize(
"str", response.headers.get("x-ms-smart-access-tier")
)

if response.status_code == 206:
response_headers["Last-Modified"] = self._deserialize("rfc-1123", response.headers.get("Last-Modified"))
Expand Down Expand Up @@ -1863,6 +1873,16 @@ def download(
response_headers["x-ms-structured-content-length"] = self._deserialize(
"int", response.headers.get("x-ms-structured-content-length")
)
response_headers["x-ms-access-tier"] = self._deserialize("str", response.headers.get("x-ms-access-tier"))
response_headers["x-ms-access-tier-inferred"] = self._deserialize(
"bool", response.headers.get("x-ms-access-tier-inferred")
)
response_headers["x-ms-access-tier-change-time"] = self._deserialize(
"rfc-1123", response.headers.get("x-ms-access-tier-change-time")
)
response_headers["x-ms-smart-access-tier"] = self._deserialize(
"str", response.headers.get("x-ms-smart-access-tier")
)

deserialized = response.stream_download(self._client._pipeline, decompress=_decompress)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
"2026-02-06",
"2026-04-06",
"2026-06-06",
"2026-10-06",
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,27 @@ def test_standard_blob_tier_set_tier_api(self, **kwargs):

blob.delete_blob()

@BlobPreparer()
@recorded_by_proxy
def test_download_blob_returns_access_tier(self, **kwargs):
storage_account_name = kwargs.pop("storage_account_name")
storage_account_key = kwargs.pop("storage_account_key")

bsc = BlobServiceClient(self.account_url(storage_account_name, "blob"), credential=storage_account_key.secret)
self._setup(bsc)
blob = self._get_blob_reference(bsc)
blob.upload_blob(b"hello world", overwrite=True)
blob.set_standard_blob_tier(StandardBlobTier.SMART)

# Act
downloader = blob.download_blob()

# Assert
assert StandardBlobTier.SMART == downloader.properties.blob_tier
assert downloader.properties.smart_access_tier is not None
assert downloader.properties.blob_tier_change_time is not None
assert not downloader.properties.blob_tier_inferred

@BlobPreparer()
@recorded_by_proxy
def test_set_standard_blob_tier_with_rehydrate_priority(self, **kwargs):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,27 @@ async def test_standard_blob_tier_set_tier_api(self, **kwargs):

await blob.delete_blob()

@BlobPreparer()
@recorded_by_proxy_async
async def test_download_blob_returns_access_tier(self, **kwargs):
storage_account_name = kwargs.pop("storage_account_name")
storage_account_key = kwargs.pop("storage_account_key")

bsc = BlobServiceClient(self.account_url(storage_account_name, "blob"), credential=storage_account_key.secret)
await self._setup(bsc)
blob = self._get_blob_reference(bsc)
await blob.upload_blob(b"hello world")
await blob.set_standard_blob_tier(StandardBlobTier.SMART)

# Act
downloader = await blob.download_blob()

# Assert
assert StandardBlobTier.SMART == downloader.properties.blob_tier
assert downloader.properties.smart_access_tier is not None
assert downloader.properties.blob_tier_change_time is not None
assert not downloader.properties.blob_tier_inferred

@BlobPreparer()
@recorded_by_proxy_async
async def test_set_std_blob_tier_w_rehydrate_priority(self, **kwargs):
Expand Down
Loading