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
15 changes: 14 additions & 1 deletion sdk/storage/azure-storage-blob/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
# Release History

## 12.30.0b1 (Unreleased)
## 12.30.0b1 (2026-03-30)

### Features Added
- Added support for service version 2026-06-06.
- Added support for connection strings and `account_url`s to accept URLs with `-ipv6` and `-dualstack` suffixes
for `BlobServiceClient`, `ContainerClient`, and `BlobClient`.
- Added support for `create` permission in `BlobSasPermissions` for `stage_block`,
`stage_block_from_url`, and `commit_block_list`.
- Added support for a new `Smart` access tier to `StandardBlobTier` used in `BlobClient.set_standard_blob_tier`,
which is optimized to automatically determine the most cost-effective access with no performance impact.
When set, `BlobProperties.smart_access_tier` will reveal the service's current access
tier choice between `Hot`, `Cool`, and `Archive`.
- Added support for `is_directory` keyword in `generate_blob_sas` that generates directory-level SAS for blobs.

### Other Changes
- Consolidated the behavior of `max_concurrency=None` by defaulting to the shared `DEFAULT_MAX_CONCURRENCY` constant.

## 12.29.0b1 (2026-01-27)

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_bd8f6233a4"
"Tag": "python/storage/azure-storage-blob_a6eb270886"
}
Original file line number Diff line number Diff line change
Expand Up @@ -1932,16 +1932,18 @@ def acquire_lease(self, lease_duration: int =-1, lease_id: Optional[str] = None,
def set_standard_blob_tier(self, standard_blob_tier: Union[str, "StandardBlobTier"], **kwargs: Any) -> None:
"""This operation sets the tier on a block blob.

A block blob's tier determines Hot/Cool/Archive storage type.
A block blob's tier determines Hot/Cool/Archive/Smart storage type.
This operation does not update the blob's ETag.

:param standard_blob_tier:
Indicates the tier to be set on the blob. Options include 'Hot', 'Cool',
'Archive'. The hot tier is optimized for storing data that is accessed
'Archive', 'Smart'. The hot tier is optimized for storing data that is accessed
frequently. The cool storage tier is optimized for storing data that
is infrequently accessed and stored for at least a month. The archive
tier is optimized for storing data that is rarely accessed and stored
for at least six months with flexible latency requirements.
for at least six months with flexible latency requirements. The smart
tier is optimized automatically to determine the most cost-effective access
tier with no performance impact.
:type standard_blob_tier: str or ~azure.storage.blob.StandardBlobTier
:keyword ~azure.storage.blob.RehydratePriority rehydrate_priority:
Indicates the priority with which to rehydrate an archived blob
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ def get_blob_properties_from_generated_code(generated: "BlobItemInternal") -> Bl
blob.deleted_time = generated.properties.deleted_time
blob.remaining_retention_days = generated.properties.remaining_retention_days
blob.blob_tier = generated.properties.access_tier # type: ignore [assignment]
blob.smart_access_tier = generated.properties.smart_access_tier
blob.rehydrate_priority = generated.properties.rehydrate_priority
blob.blob_tier_inferred = generated.properties.access_tier_inferred
blob.archive_status = generated.properties.archive_status
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -873,7 +873,7 @@ def content_as_bytes(self, max_concurrency=None):

This method is deprecated, use func:`readall` instead.

:param int max_concurrency:
:param Optional[int] max_concurrency:
The number of parallel connections with which to download.
:return: The contents of the file as bytes.
:rtype: bytes
Expand All @@ -896,7 +896,7 @@ def content_as_text(self, max_concurrency=None, encoding="UTF-8"):

This method is deprecated, use func:`readall` instead.

:param int max_concurrency:
:param Optional[int] max_concurrency:
The number of parallel connections with which to download.
:param str encoding:
Test encoding to decode the downloaded bytes. Default is UTF-8.
Expand Down Expand Up @@ -924,7 +924,7 @@ def download_to_stream(self, stream, max_concurrency=None):
The stream to download to. This can be an open file-handle,
or any writable stream. The stream must be seekable if the download
uses more than one parallel connection.
:param int max_concurrency:
:param Optional[int] max_concurrency:
The number of parallel connections with which to download.
:return: The properties of the downloaded blob.
:rtype: Any
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -582,6 +582,9 @@ async def get_properties(
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")
)
response_headers["x-ms-version-id"] = self._deserialize("str", response.headers.get("x-ms-version-id"))
response_headers["x-ms-is-current-version"] = self._deserialize(
"bool", response.headers.get("x-ms-is-current-version")
Expand Down Expand Up @@ -2177,8 +2180,8 @@ async def start_copy_from_url( # pylint: disable=too-many-locals
information. Default value is None.
:type metadata: dict[str, str]
:param tier: Optional. Indicates the tier to be set on the blob. Known values are: "P4", "P6",
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and
"Cold". Default value is None.
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive",
"Cold", and "Smart". Default value is None.
:type tier: str or ~azure.storage.blob.models.AccessTierOptional
:param rehydrate_priority: Optional: Indicates the priority with which to rehydrate an archived
blob. Known values are: "High" and "Standard". Default value is None.
Expand Down Expand Up @@ -2356,8 +2359,8 @@ async def copy_from_url( # pylint: disable=too-many-locals
information. Default value is None.
:type metadata: dict[str, str]
:param tier: Optional. Indicates the tier to be set on the blob. Known values are: "P4", "P6",
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and
"Cold". Default value is None.
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive",
"Cold", and "Smart". Default value is None.
:type tier: str or ~azure.storage.blob.models.AccessTierOptional
:param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
limit that is recorded in the analytics logs when storage analytics logging is enabled. Default
Expand Down Expand Up @@ -2624,8 +2627,8 @@ async def set_tier(
update the blob's ETag.

:param tier: Indicates the tier to be set on the blob. Known values are: "P4", "P6", "P10",
"P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and "Cold".
Required.
"P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", "Cold", and
"Smart". Required.
:type tier: str or ~azure.storage.blob.models.AccessTierRequired
:param snapshot: The snapshot parameter is an opaque DateTime value that, when present,
specifies the blob snapshot to retrieve. For more information on working with blob snapshots,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,8 +110,8 @@ async def upload( # pylint: disable=too-many-locals
information. Default value is None.
:type metadata: dict[str, str]
:param tier: Optional. Indicates the tier to be set on the blob. Known values are: "P4", "P6",
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and
"Cold". Default value is None.
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive",
"Cold", and "Smart". Default value is None.
:type tier: str or ~azure.storage.blob.models.AccessTierOptional
:param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
limit that is recorded in the analytics logs when storage analytics logging is enabled. Default
Expand Down Expand Up @@ -343,8 +343,8 @@ async def put_blob_from_url( # pylint: disable=too-many-locals
information. Default value is None.
:type metadata: dict[str, str]
:param tier: Optional. Indicates the tier to be set on the blob. Known values are: "P4", "P6",
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and
"Cold". Default value is None.
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive",
"Cold", and "Smart". Default value is None.
:type tier: str or ~azure.storage.blob.models.AccessTierOptional
:param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
limit that is recorded in the analytics logs when storage analytics logging is enabled. Default
Expand Down Expand Up @@ -930,8 +930,8 @@ async def commit_block_list( # pylint: disable=too-many-locals
information. Default value is None.
:type metadata: dict[str, str]
:param tier: Optional. Indicates the tier to be set on the blob. Known values are: "P4", "P6",
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and
"Cold". Default value is None.
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive",
"Cold", and "Smart". Default value is None.
:type tier: str or ~azure.storage.blob.models.AccessTierOptional
:param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
limit that is recorded in the analytics logs when storage analytics logging is enabled. Default
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class AccessTier(str, Enum, metaclass=CaseInsensitiveEnumMeta):
ARCHIVE = "Archive"
PREMIUM = "Premium"
COLD = "Cold"
SMART = "Smart"


class AccessTierOptional(str, Enum, metaclass=CaseInsensitiveEnumMeta):
Expand All @@ -49,6 +50,7 @@ class AccessTierOptional(str, Enum, metaclass=CaseInsensitiveEnumMeta):
COOL = "Cool"
ARCHIVE = "Archive"
COLD = "Cold"
SMART = "Smart"


class AccessTierRequired(str, Enum, metaclass=CaseInsensitiveEnumMeta):
Expand All @@ -69,6 +71,7 @@ class AccessTierRequired(str, Enum, metaclass=CaseInsensitiveEnumMeta):
COOL = "Cool"
ARCHIVE = "Archive"
COLD = "Cold"
SMART = "Smart"


class AccountKind(str, Enum, metaclass=CaseInsensitiveEnumMeta):
Expand All @@ -87,6 +90,7 @@ class ArchiveStatus(str, Enum, metaclass=CaseInsensitiveEnumMeta):
REHYDRATE_PENDING_TO_HOT = "rehydrate-pending-to-hot"
REHYDRATE_PENDING_TO_COOL = "rehydrate-pending-to-cool"
REHYDRATE_PENDING_TO_COLD = "rehydrate-pending-to-cold"
REHYDRATE_PENDING_TO_SMART = "rehydrate-pending-to-smart"


class BlobCopySourceTags(str, Enum, metaclass=CaseInsensitiveEnumMeta):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -606,13 +606,16 @@ class BlobPropertiesInternal(_serialization.Model):
:ivar remaining_retention_days:
:vartype remaining_retention_days: int
:ivar access_tier: Known values are: "P4", "P6", "P10", "P15", "P20", "P30", "P40", "P50",
"P60", "P70", "P80", "Hot", "Cool", "Archive", "Premium", and "Cold".
"P60", "P70", "P80", "Hot", "Cool", "Archive", "Premium", "Cold", and "Smart".
:vartype access_tier: str or ~azure.storage.blob.models.AccessTier
:ivar access_tier_inferred:
:vartype access_tier_inferred: bool
:ivar archive_status: Known values are: "rehydrate-pending-to-hot",
"rehydrate-pending-to-cool", and "rehydrate-pending-to-cold".
"rehydrate-pending-to-cool", "rehydrate-pending-to-cold", and "rehydrate-pending-to-smart".
:vartype archive_status: str or ~azure.storage.blob.models.ArchiveStatus
:ivar smart_access_tier: Known values are: "P4", "P6", "P10", "P15", "P20", "P30", "P40",
"P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", "Premium", "Cold", and "Smart".
:vartype smart_access_tier: str or ~azure.storage.blob.models.AccessTier
:ivar customer_provided_key_sha256:
:vartype customer_provided_key_sha256: str
:ivar encryption_scope: The name of the encryption scope under which the blob is encrypted.
Expand Down Expand Up @@ -674,6 +677,7 @@ class BlobPropertiesInternal(_serialization.Model):
"access_tier": {"key": "AccessTier", "type": "str"},
"access_tier_inferred": {"key": "AccessTierInferred", "type": "bool"},
"archive_status": {"key": "ArchiveStatus", "type": "str"},
"smart_access_tier": {"key": "SmartAccessTier", "type": "str"},
"customer_provided_key_sha256": {"key": "CustomerProvidedKeySha256", "type": "str"},
"encryption_scope": {"key": "EncryptionScope", "type": "str"},
"access_tier_change_time": {"key": "AccessTierChangeTime", "type": "rfc-1123"},
Expand Down Expand Up @@ -720,6 +724,7 @@ def __init__( # pylint: disable=too-many-locals
access_tier: Optional[Union[str, "_models.AccessTier"]] = None,
access_tier_inferred: Optional[bool] = None,
archive_status: Optional[Union[str, "_models.ArchiveStatus"]] = None,
smart_access_tier: Optional[Union[str, "_models.AccessTier"]] = None,
customer_provided_key_sha256: Optional[str] = None,
encryption_scope: Optional[str] = None,
access_tier_change_time: Optional[datetime.datetime] = None,
Expand Down Expand Up @@ -788,13 +793,16 @@ def __init__( # pylint: disable=too-many-locals
:keyword remaining_retention_days:
:paramtype remaining_retention_days: int
:keyword access_tier: Known values are: "P4", "P6", "P10", "P15", "P20", "P30", "P40", "P50",
"P60", "P70", "P80", "Hot", "Cool", "Archive", "Premium", and "Cold".
"P60", "P70", "P80", "Hot", "Cool", "Archive", "Premium", "Cold", and "Smart".
:paramtype access_tier: str or ~azure.storage.blob.models.AccessTier
:keyword access_tier_inferred:
:paramtype access_tier_inferred: bool
:keyword archive_status: Known values are: "rehydrate-pending-to-hot",
"rehydrate-pending-to-cool", and "rehydrate-pending-to-cold".
"rehydrate-pending-to-cool", "rehydrate-pending-to-cold", and "rehydrate-pending-to-smart".
:paramtype archive_status: str or ~azure.storage.blob.models.ArchiveStatus
:keyword smart_access_tier: Known values are: "P4", "P6", "P10", "P15", "P20", "P30", "P40",
"P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", "Premium", "Cold", and "Smart".
:paramtype smart_access_tier: str or ~azure.storage.blob.models.AccessTier
:keyword customer_provided_key_sha256:
:paramtype customer_provided_key_sha256: str
:keyword encryption_scope: The name of the encryption scope under which the blob is encrypted.
Expand Down Expand Up @@ -851,6 +859,7 @@ def __init__( # pylint: disable=too-many-locals
self.access_tier = access_tier
self.access_tier_inferred = access_tier_inferred
self.archive_status = archive_status
self.smart_access_tier = smart_access_tier
self.customer_provided_key_sha256 = customer_provided_key_sha256
self.encryption_scope = encryption_scope
self.access_tier_change_time = access_tier_change_time
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2052,6 +2052,9 @@ def get_properties( # pylint: disable=inconsistent-return-statements
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")
)
response_headers["x-ms-version-id"] = self._deserialize("str", response.headers.get("x-ms-version-id"))
response_headers["x-ms-is-current-version"] = self._deserialize(
"bool", response.headers.get("x-ms-is-current-version")
Expand Down Expand Up @@ -3647,8 +3650,8 @@ def start_copy_from_url( # pylint: disable=inconsistent-return-statements,too-m
information. Default value is None.
:type metadata: dict[str, str]
:param tier: Optional. Indicates the tier to be set on the blob. Known values are: "P4", "P6",
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and
"Cold". Default value is None.
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive",
"Cold", and "Smart". Default value is None.
:type tier: str or ~azure.storage.blob.models.AccessTierOptional
:param rehydrate_priority: Optional: Indicates the priority with which to rehydrate an archived
blob. Known values are: "High" and "Standard". Default value is None.
Expand Down Expand Up @@ -3826,8 +3829,8 @@ def copy_from_url( # pylint: disable=inconsistent-return-statements,too-many-lo
information. Default value is None.
:type metadata: dict[str, str]
:param tier: Optional. Indicates the tier to be set on the blob. Known values are: "P4", "P6",
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and
"Cold". Default value is None.
"P10", "P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive",
"Cold", and "Smart". Default value is None.
:type tier: str or ~azure.storage.blob.models.AccessTierOptional
:param request_id_parameter: Provides a client-generated, opaque value with a 1 KB character
limit that is recorded in the analytics logs when storage analytics logging is enabled. Default
Expand Down Expand Up @@ -4094,8 +4097,8 @@ def set_tier( # pylint: disable=inconsistent-return-statements
update the blob's ETag.

:param tier: Indicates the tier to be set on the blob. Known values are: "P4", "P6", "P10",
"P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", and "Cold".
Required.
"P15", "P20", "P30", "P40", "P50", "P60", "P70", "P80", "Hot", "Cool", "Archive", "Cold", and
"Smart". Required.
:type tier: str or ~azure.storage.blob.models.AccessTierRequired
:param snapshot: The snapshot parameter is an opaque DateTime value that, when present,
specifies the blob snapshot to retrieve. For more information on working with blob snapshots,
Expand Down
Loading
Loading