Skip to content

Commit c537c3b

Browse files
[Storage] [STG 101] Files Provisioned V2 Guardrails (#43943)
1 parent fb95607 commit c537c3b

File tree

20 files changed

+557
-164
lines changed

20 files changed

+557
-164
lines changed

sdk/storage/azure-storage-blob/azure/storage/blob/_shared/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,15 @@ class StorageErrorCode(str, Enum, metaclass=CaseInsensitiveEnumMeta):
153153
# File values
154154
CANNOT_DELETE_FILE_OR_DIRECTORY = "CannotDeleteFileOrDirectory"
155155
CLIENT_CACHE_FLUSH_DELAY = "ClientCacheFlushDelay"
156+
CONTAINER_QUOTA_DOWNGRADE_NOT_ALLOWED = "ContainerQuotaDowngradeNotAllowed"
156157
DELETE_PENDING = "DeletePending"
157158
DIRECTORY_NOT_EMPTY = "DirectoryNotEmpty"
158159
FILE_LOCK_CONFLICT = "FileLockConflict"
159160
FILE_SHARE_PROVISIONED_BANDWIDTH_DOWNGRADE_NOT_ALLOWED = "FileShareProvisionedBandwidthDowngradeNotAllowed"
161+
FILE_SHARE_PROVISIONED_BANDWIDTH_INVALID = "FileShareProvisionedBandwidthInvalid"
160162
FILE_SHARE_PROVISIONED_IOPS_DOWNGRADE_NOT_ALLOWED = "FileShareProvisionedIopsDowngradeNotAllowed"
163+
FILE_SHARE_PROVISIONED_IOPS_INVALID = "FileShareProvisionedIopsInvalid"
164+
FILE_SHARE_PROVISIONED_STORAGE_INVALID = "FileShareProvisionedStorageInvalid"
161165
INVALID_FILE_OR_DIRECTORY_PATH_NAME = "InvalidFileOrDirectoryPathName"
162166
PARENT_NOT_FOUND = "ParentNotFound"
163167
READ_ONLY_ATTRIBUTE = "ReadOnlyAttribute"
@@ -171,7 +175,10 @@ class StorageErrorCode(str, Enum, metaclass=CaseInsensitiveEnumMeta):
171175
SHARE_SNAPSHOT_NOT_FOUND = "ShareSnapshotNotFound"
172176
SHARE_SNAPSHOT_OPERATION_NOT_SUPPORTED = "ShareSnapshotOperationNotSupported"
173177
SHARE_HAS_SNAPSHOTS = "ShareHasSnapshots"
174-
CONTAINER_QUOTA_DOWNGRADE_NOT_ALLOWED = "ContainerQuotaDowngradeNotAllowed"
178+
TOTAL_SHARES_PROVISIONED_CAPACITY_EXCEEDS_ACCOUNT_LIMIT = "TotalSharesProvisionedCapacityExceedsAccountLimit"
179+
TOTAL_SHARES_PROVISIONED_IOPS_EXCEEDS_ACCOUNT_LIMIT = "TotalSharesProvisionedIopsExceedsAccountLimit"
180+
TOTAL_SHARES_PROVISIONED_BANDWIDTH_EXCEEDS_ACCOUNT_LIMIT = "TotalSharesProvisionedBandwidthExceedsAccountLimit"
181+
TOTAL_SHARES_COUNT_EXCEEDS_ACCOUNT_LIMIT = "TotalSharesCountExceedsAccountLimit"
175182

176183
# DataLake values
177184
CONTENT_LENGTH_MUST_BE_ZERO = "ContentLengthMustBeZero"

sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/models.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,15 @@ class StorageErrorCode(str, Enum, metaclass=CaseInsensitiveEnumMeta):
153153
# File values
154154
CANNOT_DELETE_FILE_OR_DIRECTORY = "CannotDeleteFileOrDirectory"
155155
CLIENT_CACHE_FLUSH_DELAY = "ClientCacheFlushDelay"
156+
CONTAINER_QUOTA_DOWNGRADE_NOT_ALLOWED = "ContainerQuotaDowngradeNotAllowed"
156157
DELETE_PENDING = "DeletePending"
157158
DIRECTORY_NOT_EMPTY = "DirectoryNotEmpty"
158159
FILE_LOCK_CONFLICT = "FileLockConflict"
159160
FILE_SHARE_PROVISIONED_BANDWIDTH_DOWNGRADE_NOT_ALLOWED = "FileShareProvisionedBandwidthDowngradeNotAllowed"
161+
FILE_SHARE_PROVISIONED_BANDWIDTH_INVALID = "FileShareProvisionedBandwidthInvalid"
160162
FILE_SHARE_PROVISIONED_IOPS_DOWNGRADE_NOT_ALLOWED = "FileShareProvisionedIopsDowngradeNotAllowed"
163+
FILE_SHARE_PROVISIONED_IOPS_INVALID = "FileShareProvisionedIopsInvalid"
164+
FILE_SHARE_PROVISIONED_STORAGE_INVALID = "FileShareProvisionedStorageInvalid"
161165
INVALID_FILE_OR_DIRECTORY_PATH_NAME = "InvalidFileOrDirectoryPathName"
162166
PARENT_NOT_FOUND = "ParentNotFound"
163167
READ_ONLY_ATTRIBUTE = "ReadOnlyAttribute"
@@ -171,7 +175,10 @@ class StorageErrorCode(str, Enum, metaclass=CaseInsensitiveEnumMeta):
171175
SHARE_SNAPSHOT_NOT_FOUND = "ShareSnapshotNotFound"
172176
SHARE_SNAPSHOT_OPERATION_NOT_SUPPORTED = "ShareSnapshotOperationNotSupported"
173177
SHARE_HAS_SNAPSHOTS = "ShareHasSnapshots"
174-
CONTAINER_QUOTA_DOWNGRADE_NOT_ALLOWED = "ContainerQuotaDowngradeNotAllowed"
178+
TOTAL_SHARES_PROVISIONED_CAPACITY_EXCEEDS_ACCOUNT_LIMIT = "TotalSharesProvisionedCapacityExceedsAccountLimit"
179+
TOTAL_SHARES_PROVISIONED_IOPS_EXCEEDS_ACCOUNT_LIMIT = "TotalSharesProvisionedIopsExceedsAccountLimit"
180+
TOTAL_SHARES_PROVISIONED_BANDWIDTH_EXCEEDS_ACCOUNT_LIMIT = "TotalSharesProvisionedBandwidthExceedsAccountLimit"
181+
TOTAL_SHARES_COUNT_EXCEEDS_ACCOUNT_LIMIT = "TotalSharesCountExceedsAccountLimit"
175182

176183
# DataLake values
177184
CONTENT_LENGTH_MUST_BE_ZERO = "ContentLengthMustBeZero"

sdk/storage/azure-storage-file-share/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### Features Added
66
- Added support for service version 2026-04-06.
7+
- Added support for improved error handling for file share provisioning.
78

89
## 12.24.0b1 (Unreleased)
910

sdk/storage/azure-storage-file-share/azure/storage/fileshare/_generated/_azure_file_storage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class AzureFileStorage: # pylint: disable=client-accepts-api-version-keyword
4545
URI. Default value is None.
4646
:type allow_source_trailing_dot: bool
4747
:keyword version: Specifies the version of the operation to use for this request. Default value
48-
is "2026-02-06". Note that overriding this default value may result in unsupported behavior.
48+
is "2026-04-06". Note that overriding this default value may result in unsupported behavior.
4949
:paramtype version: str
5050
:keyword file_range_write_from_url: Only update is supported: - Update: Writes the bytes
5151
downloaded from the source url into the specified range. Default value is "update". Note that

sdk/storage/azure-storage-file-share/azure/storage/fileshare/_generated/_configuration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class AzureFileStorageConfiguration: # pylint: disable=too-many-instance-attrib
3333
URI. Default value is None.
3434
:type allow_source_trailing_dot: bool
3535
:keyword version: Specifies the version of the operation to use for this request. Default value
36-
is "2026-02-06". Note that overriding this default value may result in unsupported behavior.
36+
is "2026-04-06". Note that overriding this default value may result in unsupported behavior.
3737
:paramtype version: str
3838
:keyword file_range_write_from_url: Only update is supported: - Update: Writes the bytes
3939
downloaded from the source url into the specified range. Default value is "update". Note that
@@ -49,7 +49,7 @@ def __init__(
4949
allow_source_trailing_dot: Optional[bool] = None,
5050
**kwargs: Any
5151
) -> None:
52-
version: Literal["2026-02-06"] = kwargs.pop("version", "2026-02-06")
52+
version: Literal["2026-04-06"] = kwargs.pop("version", "2026-04-06")
5353
file_range_write_from_url: Literal["update"] = kwargs.pop("file_range_write_from_url", "update")
5454

5555
if url is None:

sdk/storage/azure-storage-file-share/azure/storage/fileshare/_generated/_utils/serialization.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,7 @@ def serialize_data(self, data, data_type, **kwargs):
787787

788788
# If dependencies is empty, try with current data class
789789
# It has to be a subclass of Enum anyway
790-
enum_type = self.dependencies.get(data_type, data.__class__)
790+
enum_type = self.dependencies.get(data_type, cast(type, data.__class__))
791791
if issubclass(enum_type, Enum):
792792
return Serializer.serialize_enum(data, enum_obj=enum_type)
793793

sdk/storage/azure-storage-file-share/azure/storage/fileshare/_generated/aio/_azure_file_storage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class AzureFileStorage: # pylint: disable=client-accepts-api-version-keyword
4545
URI. Default value is None.
4646
:type allow_source_trailing_dot: bool
4747
:keyword version: Specifies the version of the operation to use for this request. Default value
48-
is "2026-02-06". Note that overriding this default value may result in unsupported behavior.
48+
is "2026-04-06". Note that overriding this default value may result in unsupported behavior.
4949
:paramtype version: str
5050
:keyword file_range_write_from_url: Only update is supported: - Update: Writes the bytes
5151
downloaded from the source url into the specified range. Default value is "update". Note that

sdk/storage/azure-storage-file-share/azure/storage/fileshare/_generated/aio/_configuration.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class AzureFileStorageConfiguration: # pylint: disable=too-many-instance-attrib
3333
URI. Default value is None.
3434
:type allow_source_trailing_dot: bool
3535
:keyword version: Specifies the version of the operation to use for this request. Default value
36-
is "2026-02-06". Note that overriding this default value may result in unsupported behavior.
36+
is "2026-04-06". Note that overriding this default value may result in unsupported behavior.
3737
:paramtype version: str
3838
:keyword file_range_write_from_url: Only update is supported: - Update: Writes the bytes
3939
downloaded from the source url into the specified range. Default value is "update". Note that
@@ -49,7 +49,7 @@ def __init__(
4949
allow_source_trailing_dot: Optional[bool] = None,
5050
**kwargs: Any
5151
) -> None:
52-
version: Literal["2026-02-06"] = kwargs.pop("version", "2026-02-06")
52+
version: Literal["2026-04-06"] = kwargs.pop("version", "2026-04-06")
5353
file_range_write_from_url: Literal["update"] = kwargs.pop("file_range_write_from_url", "update")
5454

5555
if url is None:

sdk/storage/azure-storage-file-share/azure/storage/fileshare/_generated/aio/operations/_directory_operations.py

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,10 @@ async def create(
183183

184184
if response.status_code not in [201]:
185185
map_error(status_code=response.status_code, response=response, error_map=error_map)
186-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
186+
error = self._deserialize.failsafe_deserialize(
187+
_models.StorageError,
188+
pipeline_response,
189+
)
187190
raise HttpResponseError(response=response, model=error)
188191

189192
response_headers = {}
@@ -276,7 +279,10 @@ async def get_properties(
276279

277280
if response.status_code not in [200]:
278281
map_error(status_code=response.status_code, response=response, error_map=error_map)
279-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
282+
error = self._deserialize.failsafe_deserialize(
283+
_models.StorageError,
284+
pipeline_response,
285+
)
280286
raise HttpResponseError(response=response, model=error)
281287

282288
response_headers = {}
@@ -363,7 +369,10 @@ async def delete(self, timeout: Optional[int] = None, **kwargs: Any) -> None:
363369

364370
if response.status_code not in [202]:
365371
map_error(status_code=response.status_code, response=response, error_map=error_map)
366-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
372+
error = self._deserialize.failsafe_deserialize(
373+
_models.StorageError,
374+
pipeline_response,
375+
)
367376
raise HttpResponseError(response=response, model=error)
368377

369378
response_headers = {}
@@ -486,7 +495,10 @@ async def set_properties(
486495

487496
if response.status_code not in [200]:
488497
map_error(status_code=response.status_code, response=response, error_map=error_map)
489-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
498+
error = self._deserialize.failsafe_deserialize(
499+
_models.StorageError,
500+
pipeline_response,
501+
)
490502
raise HttpResponseError(response=response, model=error)
491503

492504
response_headers = {}
@@ -578,7 +590,10 @@ async def set_metadata(
578590

579591
if response.status_code not in [200]:
580592
map_error(status_code=response.status_code, response=response, error_map=error_map)
581-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
593+
error = self._deserialize.failsafe_deserialize(
594+
_models.StorageError,
595+
pipeline_response,
596+
)
582597
raise HttpResponseError(response=response, model=error)
583598

584599
response_headers = {}
@@ -680,7 +695,10 @@ async def list_files_and_directories_segment(
680695

681696
if response.status_code not in [200]:
682697
map_error(status_code=response.status_code, response=response, error_map=error_map)
683-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
698+
error = self._deserialize.failsafe_deserialize(
699+
_models.StorageError,
700+
pipeline_response,
701+
)
684702
raise HttpResponseError(response=response, model=error)
685703

686704
response_headers = {}
@@ -771,7 +789,10 @@ async def list_handles(
771789

772790
if response.status_code not in [200]:
773791
map_error(status_code=response.status_code, response=response, error_map=error_map)
774-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
792+
error = self._deserialize.failsafe_deserialize(
793+
_models.StorageError,
794+
pipeline_response,
795+
)
775796
raise HttpResponseError(response=response, model=error)
776797

777798
response_headers = {}
@@ -861,7 +882,10 @@ async def force_close_handles(
861882

862883
if response.status_code not in [200]:
863884
map_error(status_code=response.status_code, response=response, error_map=error_map)
864-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
885+
error = self._deserialize.failsafe_deserialize(
886+
_models.StorageError,
887+
pipeline_response,
888+
)
865889
raise HttpResponseError(response=response, model=error)
866890

867891
response_headers = {}
@@ -1016,7 +1040,10 @@ async def rename(
10161040

10171041
if response.status_code not in [200]:
10181042
map_error(status_code=response.status_code, response=response, error_map=error_map)
1019-
error = self._deserialize.failsafe_deserialize(_models.StorageError, pipeline_response)
1043+
error = self._deserialize.failsafe_deserialize(
1044+
_models.StorageError,
1045+
pipeline_response,
1046+
)
10201047
raise HttpResponseError(response=response, model=error)
10211048

10221049
response_headers = {}

0 commit comments

Comments
 (0)