From 132c9abc36dceb4b69aec08642ba594f14ab631d Mon Sep 17 00:00:00 2001 From: xiafu Date: Thu, 16 Sep 2021 01:14:06 -0700 Subject: [PATCH 1/2] [Storage]Unify service version and update changelog --- sdk/storage/azure-storage-blob/CHANGELOG.md | 7 +++++ .../azure/storage/blob/_blob_client.py | 3 +-- .../storage/blob/_blob_service_client.py | 3 +-- .../azure/storage/blob/_container_client.py | 3 +-- .../azure/storage/blob/_serialize.py | 6 ++--- .../azure/storage/blob/_version.py | 2 +- .../storage/blob/aio/_blob_client_async.py | 3 +-- .../blob/aio/_blob_service_client_async.py | 3 +-- .../blob/aio/_container_client_async.py | 3 +-- sdk/storage/azure-storage-blob/setup.py | 2 +- .../azure-storage-file-datalake/CHANGELOG.md | 5 ++++ .../_data_lake_directory_client.py | 2 ++ .../filedatalake/_data_lake_service_client.py | 9 ++++++- .../filedatalake/_file_system_client.py | 7 ++++- .../storage/filedatalake/_path_client.py | 8 +++++- .../azure/storage/filedatalake/_serialize.py | 22 ++++++++++++++++ .../azure/storage/filedatalake/_version.py | 2 +- .../aio/_data_lake_directory_client_async.py | 2 ++ .../aio/_data_lake_service_client_async.py | 5 ++++ .../aio/_file_system_client_async.py | 7 +++++ .../filedatalake/aio/_path_client_async.py | 5 ++++ .../azure-storage-file-datalake/setup.py | 2 +- .../tests/test_directory.py | 25 ++++++++++++++++++ .../tests/test_directory_async.py | 24 +++++++++++++++++ .../azure-storage-file-share/CHANGELOG.md | 5 ++++ .../storage/fileshare/_directory_client.py | 3 +-- .../azure/storage/fileshare/_file_client.py | 3 +-- .../azure/storage/fileshare/_serialize.py | 8 +++--- .../azure/storage/fileshare/_share_client.py | 3 +-- .../fileshare/_share_service_client.py | 3 +-- .../azure/storage/fileshare/_version.py | 2 +- .../fileshare/aio/_directory_client_async.py | 3 +-- .../fileshare/aio/_file_client_async.py | 3 +-- .../fileshare/aio/_share_client_async.py | 3 +-- .../aio/_share_service_client_async.py | 3 +-- sdk/storage/azure-storage-file-share/setup.py | 2 +- .../azure/storage/queue/_queue_client.py | 4 +-- .../storage/queue/_queue_service_client.py | 4 +-- .../azure/storage/queue/_serialize.py | 26 +++++++++++++++++++ .../storage/queue/aio/_queue_client_async.py | 4 +-- .../queue/aio/_queue_service_client_async.py | 4 +-- .../tests/test_queue_client.py | 16 ++++++++++++ .../tests/test_queue_client_async.py | 14 ++++++++++ 43 files changed, 222 insertions(+), 51 deletions(-) create mode 100644 sdk/storage/azure-storage-queue/azure/storage/queue/_serialize.py diff --git a/sdk/storage/azure-storage-blob/CHANGELOG.md b/sdk/storage/azure-storage-blob/CHANGELOG.md index 0142c75381fa..6d927065b034 100644 --- a/sdk/storage/azure-storage-blob/CHANGELOG.md +++ b/sdk/storage/azure-storage-blob/CHANGELOG.md @@ -1,5 +1,12 @@ # Release History +## 12.9.0 (2021-09-15) +**Stable release of preview features** +- Added support for service version 2020-10-02 (STG78) +- Added support for object level immutability policy with versioning (Version Level WORM). +- Added support for listing deleted root blobs that have versions. +- Added OAuth support for sync copy blob source. + ## 12.9.0b1 (2021-07-27) **New Features** - Added support for object level immutability policy with versioning (Version Level WORM). diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py index e1b1b51e8e78..902c01338b80 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_client.py @@ -176,8 +176,7 @@ def __init__( self._query_str, credential = self._format_query_string(sas_token, credential, snapshot=self.snapshot) super(BlobClient, self).__init__(parsed_url, service='blob', credential=credential, **kwargs) self._client = AzureBlobStorage(self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access def _format_url(self, hostname): container_name = self.container_name diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_service_client.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_service_client.py index d277a094921a..33b61202934e 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_service_client.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_blob_service_client.py @@ -134,8 +134,7 @@ def __init__( self._query_str, credential = self._format_query_string(sas_token, credential) super(BlobServiceClient, self).__init__(parsed_url, service='blob', credential=credential, **kwargs) self._client = AzureBlobStorage(self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access def _format_url(self, hostname): """Format the endpoint URL according to the current location diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_container_client.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_container_client.py index 82bfe1b04110..59f17d6cfd9b 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_container_client.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_container_client.py @@ -156,8 +156,7 @@ def __init__( self._query_str, credential = self._format_query_string(sas_token, credential) super(ContainerClient, self).__init__(parsed_url, service='blob', credential=credential, **kwargs) self._client = AzureBlobStorage(self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access def _format_url(self, hostname): container_name = self.container_name diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py index 701a88ae408e..d44c5ade481b 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_serialize.py @@ -126,13 +126,13 @@ def get_container_cpk_scope_info(kwargs): return None -def get_api_version(kwargs, default): +def get_api_version(kwargs): # type: (Dict[str, Any], str) -> str - api_version = kwargs.pop('api_version', None) + api_version = kwargs.get('api_version', None) if api_version and api_version not in _SUPPORTED_API_VERSIONS: versions = '\n'.join(_SUPPORTED_API_VERSIONS) raise ValueError("Unsupported API version '{}'. Please select from:\n{}".format(api_version, versions)) - return api_version or default + return api_version or _SUPPORTED_API_VERSIONS[-1] def serialize_blob_tags_header(tags=None): diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py b/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py index b21fcd5488bb..68dc9539e3f5 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.9.0b1" +VERSION = "12.9.0" diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_client_async.py b/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_client_async.py index d75943b97c97..97b412ec1b0f 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_client_async.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_client_async.py @@ -120,8 +120,7 @@ def __init__( credential=credential, **kwargs) self._client = AzureBlobStorage(url=self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access @distributed_trace_async async def get_account_information(self, **kwargs): # type: ignore diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_service_client_async.py b/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_service_client_async.py index d50661d8e2d7..9cb1563f9f43 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_service_client_async.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_blob_service_client_async.py @@ -118,8 +118,7 @@ def __init__( credential=credential, **kwargs) self._client = AzureBlobStorage(url=self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access @distributed_trace_async async def get_user_delegation_key(self, key_start_time, # type: datetime diff --git a/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_container_client_async.py b/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_container_client_async.py index 794bc55c7f84..2f73b9c077e5 100644 --- a/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_container_client_async.py +++ b/sdk/storage/azure-storage-blob/azure/storage/blob/aio/_container_client_async.py @@ -117,8 +117,7 @@ def __init__( credential=credential, **kwargs) self._client = AzureBlobStorage(url=self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access @distributed_trace_async async def create_container(self, metadata=None, public_access=None, **kwargs): diff --git a/sdk/storage/azure-storage-blob/setup.py b/sdk/storage/azure-storage-blob/setup.py index 41aa96cccedd..dad24446aab3 100644 --- a/sdk/storage/azure-storage-blob/setup.py +++ b/sdk/storage/azure-storage-blob/setup.py @@ -72,7 +72,7 @@ author_email='ascl@microsoft.com', url='https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-blob', classifiers=[ - 'Development Status :: 4 - Beta', + "Development Status :: 5 - Production/Stable", 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', diff --git a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md index 26b20a054ad1..7dee9165ed9f 100644 --- a/sdk/storage/azure-storage-file-datalake/CHANGELOG.md +++ b/sdk/storage/azure-storage-file-datalake/CHANGELOG.md @@ -1,5 +1,10 @@ # Release History +## 12.5.0 (2021-09-15) +**Stable release of preview features** +- Added support for service version 2020-10-02 (STG78) +- Added support for quick query parquet + ## 12.5.0b1 (2021-07-27) **New features** - Added support for quick query parquet diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_directory_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_directory_client.py index c42391e6071b..042fa0551590 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_directory_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_directory_client.py @@ -527,6 +527,7 @@ def get_file_client(self, file # type: Union[FileProperties, str] ) return DataLakeFileClient( self.url, self.file_system_name, file_path=file_path, credential=self._raw_credential, + api_version=self.api_version, _hosts=self._hosts, _configuration=self._config, _pipeline=self._pipeline, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, @@ -557,6 +558,7 @@ def get_sub_directory_client(self, sub_directory # type: Union[DirectoryPropert ) return DataLakeDirectoryClient( self.url, self.file_system_name, directory_name=subdir_path, credential=self._raw_credential, + api_version=self.api_version, _hosts=self._hosts, _configuration=self._config, _pipeline=self._pipeline, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py index 211df05827c2..776b98cda9d6 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_service_client.py @@ -20,7 +20,8 @@ from ._data_lake_directory_client import DataLakeDirectoryClient from ._data_lake_file_client import DataLakeFileClient from ._models import UserDelegationKey, FileSystemPropertiesPaged, LocationMode -from ._serialize import convert_dfs_url_to_blob_url +from ._serialize import convert_dfs_url_to_blob_url, get_api_version +from ._generated import AzureDataLakeStorageRESTAPI class DataLakeServiceClient(StorageAccountHostsMixin): @@ -94,6 +95,9 @@ def __init__( # ADLS doesn't support secondary endpoint, make sure it's empty self._hosts[LocationMode.SECONDARY] = "" + self._client = AzureDataLakeStorageRESTAPI(self.url, pipeline=self._pipeline) + self._client._config.version = get_api_version(kwargs) #pylint: disable=protected-access + def __enter__(self): self._blob_service_client.__enter__() return self @@ -388,6 +392,7 @@ def get_file_system_client(self, file_system # type: Union[FileSystemProperties policies=self._pipeline._impl_policies # pylint: disable = protected-access ) return FileSystemClient(self.url, file_system_name, credential=self._raw_credential, + api_version=self.api_version, _configuration=self._config, _pipeline=_pipeline, _hosts=self._hosts, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, @@ -436,6 +441,7 @@ def get_directory_client(self, file_system, # type: Union[FileSystemProperties, ) return DataLakeDirectoryClient(self.url, file_system_name, directory_name=directory_name, credential=self._raw_credential, + api_version=self.api_version, _configuration=self._config, _pipeline=_pipeline, _hosts=self._hosts, require_encryption=self.require_encryption, @@ -486,6 +492,7 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] ) return DataLakeFileClient( self.url, file_system_name, file_path=file_path, credential=self._raw_credential, + api_version=self.api_version, _hosts=self._hosts, _configuration=self._config, _pipeline=_pipeline, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py index 94af506b5a3f..148943c12cda 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_file_system_client.py @@ -19,7 +19,7 @@ from azure.core.paging import ItemPaged from azure.storage.blob import ContainerClient from ._shared.base_client import TransportWrapper, StorageAccountHostsMixin, parse_query, parse_connection_str -from ._serialize import convert_dfs_url_to_blob_url +from ._serialize import convert_dfs_url_to_blob_url, get_api_version from ._list_paths_helper import DeletedPathPropertiesPaged from ._models import LocationMode, FileSystemProperties, PublicAccess, DeletedPathProperties, FileProperties, \ DirectoryProperties @@ -105,9 +105,12 @@ def __init__( # ADLS doesn't support secondary endpoint, make sure it's empty self._hosts[LocationMode.SECONDARY] = "" self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, pipeline=self._pipeline) + api_version = get_api_version(kwargs) + self._client._config.version = api_version # pylint: disable=protected-access self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url, file_system=file_system_name, pipeline=self._pipeline) + self._datalake_client_for_blob_operation._config.version = api_version # pylint: disable=protected-access def _format_url(self, hostname): file_system_name = self.file_system_name @@ -839,6 +842,7 @@ def get_directory_client(self, directory # type: Union[DirectoryProperties, str ) return DataLakeDirectoryClient(self.url, self.file_system_name, directory_name=directory_name, credential=self._raw_credential, + api_version=self.api_version, _configuration=self._config, _pipeline=_pipeline, _hosts=self._hosts, require_encryption=self.require_encryption, @@ -879,6 +883,7 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] ) return DataLakeFileClient( self.url, self.file_system_name, file_path=file_path, credential=self._raw_credential, + api_version=self.api_version, _hosts=self._hosts, _configuration=self._config, _pipeline=_pipeline, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py index 8f0f58869fe3..16983811ed5a 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_path_client.py @@ -22,7 +22,8 @@ from ._models import LocationMode, DirectoryProperties, AccessControlChangeResult, AccessControlChanges, \ AccessControlChangeCounters, AccessControlChangeFailure from ._serialize import convert_dfs_url_to_blob_url, get_mod_conditions, \ - get_path_http_headers, add_metadata_headers, get_lease_id, get_source_mod_conditions, get_access_conditions + get_path_http_headers, add_metadata_headers, get_lease_id, get_source_mod_conditions, get_access_conditions, \ + get_api_version from ._shared.base_client import StorageAccountHostsMixin, parse_query from ._shared.response_handlers import return_response_headers, return_headers_and_deserialized @@ -81,13 +82,18 @@ def __init__( _hosts=datalake_hosts, **kwargs) # ADLS doesn't support secondary endpoint, make sure it's empty self._hosts[LocationMode.SECONDARY] = "" + api_version = get_api_version(kwargs) + self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, path=path_name, pipeline=self._pipeline) + self._client._config.version = api_version # pylint: disable=protected-access + self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI( self._blob_client.url, file_system=file_system_name, path=path_name, pipeline=self._pipeline) + self._datalake_client_for_blob_operation._config.version = api_version # pylint: disable=protected-access def __exit__(self, *args): self._blob_client.close() diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_serialize.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_serialize.py index 9d700bfb029f..304e043629fa 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_serialize.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_serialize.py @@ -9,6 +9,28 @@ SourceModifiedAccessConditions, LeaseAccessConditions +_SUPPORTED_API_VERSIONS = [ + '2019-02-02', + '2019-07-07', + '2019-10-10', + '2019-12-12', + '2020-02-10', + '2020-04-08', + '2020-06-12', + '2020-08-04', + '2020-10-02' +] + + +def get_api_version(kwargs): + # type: (Dict[str, Any], str) -> str + api_version = kwargs.get('api_version', None) + if api_version and api_version not in _SUPPORTED_API_VERSIONS: + versions = '\n'.join(_SUPPORTED_API_VERSIONS) + raise ValueError("Unsupported API version '{}'. Please select from:\n{}".format(api_version, versions)) + return api_version or _SUPPORTED_API_VERSIONS[-1] + + def convert_dfs_url_to_blob_url(dfs_account_url): return dfs_account_url.replace('.dfs.', '.blob.', 1) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py index bfd3230dfa42..d731da5c4072 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.5.0b1" +VERSION = "12.5.0" diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_directory_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_directory_client_async.py index 7d0adefd2680..6254efbbfa9f 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_directory_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_directory_client_async.py @@ -506,6 +506,7 @@ def get_file_client(self, file # type: Union[FileProperties, str] ) return DataLakeFileClient( self.url, self.file_system_name, file_path=file_path, credential=self._raw_credential, + api_version=self.api_version, _hosts=self._hosts, _configuration=self._config, _pipeline=self._pipeline, _location_mode=self._location_mode, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, @@ -545,6 +546,7 @@ def get_sub_directory_client(self, sub_directory # type: Union[DirectoryPropert ) return DataLakeDirectoryClient( self.url, self.file_system_name, directory_name=subdir_path, credential=self._raw_credential, + api_version=self.api_version, _hosts=self._hosts, _configuration=self._config, _pipeline=self._pipeline, _location_mode=self._location_mode, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py index 76493e89c5b6..44aae0a5e85f 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_service_client_async.py @@ -10,6 +10,7 @@ from azure.core.pipeline import AsyncPipeline from azure.storage.blob.aio import BlobServiceClient +from .._serialize import get_api_version from .._generated.aio import AzureDataLakeStorageRESTAPI from .._deserialize import get_datalake_service_properties from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin @@ -80,6 +81,7 @@ def __init__( self._blob_service_client = BlobServiceClient(self._blob_account_url, credential, **kwargs) self._blob_service_client._hosts[LocationMode.SECONDARY] = "" #pylint: disable=protected-access self._client = AzureDataLakeStorageRESTAPI(self.url, pipeline=self._pipeline) + self._client._config.version = get_api_version(kwargs) #pylint: disable=protected-access self._loop = kwargs.get('loop', None) async def __aenter__(self): @@ -337,6 +339,7 @@ def get_file_system_client(self, file_system # type: Union[FileSystemProperties policies=self._pipeline._impl_policies # pylint: disable = protected-access ) return FileSystemClient(self.url, file_system_name, credential=self._raw_credential, + api_version=self.api_version, _configuration=self._config, _pipeline=self._pipeline, _hosts=self._hosts, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, @@ -385,6 +388,7 @@ def get_directory_client(self, file_system, # type: Union[FileSystemProperties, ) return DataLakeDirectoryClient(self.url, file_system_name, directory_name=directory_name, credential=self._raw_credential, + api_version=self.api_version, _configuration=self._config, _pipeline=self._pipeline, _hosts=self._hosts, require_encryption=self.require_encryption, @@ -435,6 +439,7 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] ) return DataLakeFileClient( self.url, file_system_name, file_path=file_path, credential=self._raw_credential, + api_version=self.api_version, _hosts=self._hosts, _configuration=self._config, _pipeline=self._pipeline, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py index 02f71424e1a0..90ace3e50697 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_file_system_client_async.py @@ -18,6 +18,7 @@ from azure.core.tracing.decorator_async import distributed_trace_async from azure.storage.blob.aio import ContainerClient +from .._serialize import get_api_version from .._deserialize import process_storage_error, is_file_path from .._generated.models import ListBlobsIncludeItem @@ -98,6 +99,10 @@ def __init__( self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url, file_system=file_system_name, pipeline=self._pipeline) + api_version = get_api_version(kwargs) + self._client._config.version = api_version # pylint: disable=protected-access + self._datalake_client_for_blob_operation._config.version = api_version # pylint: disable=protected-access + self._loop = kwargs.get('loop', None) async def __aexit__(self, *args): @@ -787,6 +792,7 @@ def get_directory_client(self, directory # type: Union[DirectoryProperties, str ) return DataLakeDirectoryClient(self.url, self.file_system_name, directory_name=directory_name, credential=self._raw_credential, + api_version=self.api_version, _configuration=self._config, _pipeline=_pipeline, _hosts=self._hosts, require_encryption=self.require_encryption, @@ -828,6 +834,7 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] ) return DataLakeFileClient( self.url, self.file_system_name, file_path=file_path, credential=self._raw_credential, + api_version=self.api_version, _hosts=self._hosts, _configuration=self._config, _pipeline=_pipeline, require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py index 80c43d77704d..42d783c4350d 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py @@ -9,6 +9,7 @@ from azure.core.exceptions import AzureError, HttpResponseError from azure.storage.blob.aio import BlobClient +from .._serialize import get_api_version from .._shared.base_client_async import AsyncStorageAccountHostsMixin from .._path_client import PathClient as PathClientBase from .._models import DirectoryProperties, AccessControlChangeResult, AccessControlChangeFailure, \ @@ -53,6 +54,10 @@ def __init__( file_system=file_system_name, path=path_name, pipeline=self._pipeline) + api_version = get_api_version(kwargs) + self._client._config.version = api_version # pylint: disable=protected-access + self._datalake_client_for_blob_operation._config.version = api_version # pylint: disable=protected-access + self._loop = kwargs.get('loop', None) async def __aexit__(self, *args): diff --git a/sdk/storage/azure-storage-file-datalake/setup.py b/sdk/storage/azure-storage-file-datalake/setup.py index 371bef74bbbb..7c4e0eea3688 100644 --- a/sdk/storage/azure-storage-file-datalake/setup.py +++ b/sdk/storage/azure-storage-file-datalake/setup.py @@ -73,7 +73,7 @@ author_email='ascl@microsoft.com', url='https://github.com/Azure/azure-sdk-for-python', classifiers=[ - 'Development Status :: 4 - Beta', + "Development Status :: 5 - Production/Stable", 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py index 95afd9d4a3c4..f92fd49a1745 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py @@ -16,6 +16,8 @@ generate_file_system_sas, FileSystemSasPermissions from azure.storage.filedatalake import DataLakeServiceClient, generate_directory_sas from azure.storage.filedatalake._models import AccessControlChangeResult, AccessControlChangeCounters +from azure.storage.filedatalake._serialize import _SUPPORTED_API_VERSIONS + from testcase import ( StorageTestCase, @@ -1113,6 +1115,29 @@ def test_using_directory_sas_to_create_file(self, datalake_storage_account_name, with self.assertRaises(HttpResponseError): directory_client.delete_directory() + + @DataLakePreparer() + def test_using_directory_sas_to_create_file(self, datalake_storage_account_name, datalake_storage_account_key): + newest_api_version = _SUPPORTED_API_VERSIONS[-1] + + service_client = DataLakeServiceClient("https://abc.dfs.core.windows.net", credential='fake') + filesys_client = service_client.get_file_system_client("filesys") + dir_client = DataLakeDirectoryClient("https://abc.dfs.core.windows.net", "filesys", "dir", credential='fake') + file_client = dir_client.get_file_client("file") + self.assertEqual(service_client.api_version, newest_api_version) + self.assertEqual(filesys_client.api_version, newest_api_version) + self.assertEqual(dir_client.api_version, newest_api_version) + self.assertEqual(file_client.api_version, newest_api_version) + + service_client2 = DataLakeServiceClient("https://abc.dfs.core.windows.net", credential='fake', api_version="2019-02-02") + filesys_client2 = service_client2.get_file_system_client("filesys") + dir_client2 = DataLakeDirectoryClient("https://abc.dfs.core.windows.net", "filesys", "dir", credential='fake', api_version="2019-02-02") + file_client2 = dir_client2.get_file_client("file") + self.assertEqual(service_client2.api_version, "2019-02-02") + self.assertEqual(filesys_client2.api_version, "2019-02-02") + self.assertEqual(dir_client2.api_version, "2019-02-02") + self.assertEqual(file_client2.api_version, "2019-02-02") + # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py index 6a2845d39e8c..75b6d0c3d5e9 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory_async.py @@ -21,6 +21,7 @@ from azure.storage.filedatalake import generate_directory_sas from azure.storage.filedatalake.aio import DataLakeServiceClient, DataLakeDirectoryClient from azure.storage.filedatalake import AccessControlChangeResult, AccessControlChangeCounters +from azure.storage.filedatalake._serialize import _SUPPORTED_API_VERSIONS from asynctestcase import ( StorageTestCase, @@ -1086,6 +1087,29 @@ async def test_using_directory_sas_to_create_async(self, datalake_storage_accoun response = await directory_client.create_directory() self.assertIsNotNone(response) + @DataLakePreparer() + def test_using_directory_sas_to_create_file(self, datalake_storage_account_name, datalake_storage_account_key): + newest_api_version = _SUPPORTED_API_VERSIONS[-1] + + service_client = DataLakeServiceClient("https://abc.dfs.core.windows.net", credential='fake') + filesys_client = service_client.get_file_system_client("filesys") + dir_client = DataLakeDirectoryClient("https://abc.dfs.core.windows.net", "filesys", "dir", credential='fake') + file_client = dir_client.get_file_client("file") + self.assertEqual(service_client.api_version, newest_api_version) + self.assertEqual(filesys_client.api_version, newest_api_version) + self.assertEqual(dir_client.api_version, newest_api_version) + self.assertEqual(file_client.api_version, newest_api_version) + + service_client2 = DataLakeServiceClient("https://abc.dfs.core.windows.net", credential='fake', + api_version="2019-02-02") + filesys_client2 = service_client2.get_file_system_client("filesys") + dir_client2 = DataLakeDirectoryClient("https://abc.dfs.core.windows.net", "filesys", "dir", credential='fake', + api_version="2019-02-02") + file_client2 = dir_client2.get_file_client("file") + self.assertEqual(service_client2.api_version, "2019-02-02") + self.assertEqual(filesys_client2.api_version, "2019-02-02") + self.assertEqual(dir_client2.api_version, "2019-02-02") + self.assertEqual(file_client2.api_version, "2019-02-02") # ------------------------------------------------------------------------------ if __name__ == '__main__': diff --git a/sdk/storage/azure-storage-file-share/CHANGELOG.md b/sdk/storage/azure-storage-file-share/CHANGELOG.md index 38fb1e05b25d..e61e3980d687 100644 --- a/sdk/storage/azure-storage-file-share/CHANGELOG.md +++ b/sdk/storage/azure-storage-file-share/CHANGELOG.md @@ -1,5 +1,10 @@ # Release History +## 12.6.0 (2021-09-15) +**Stable release of preview features** +- Added support for service version 2020-10-02 (STG78) +- Added OAuth support for file copy source. + ## 12.6.0b1 (2021-07-27) **New features** - Added OAuth support for file copy source. diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_directory_client.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_directory_client.py index 7f8b22d5a56d..1c9d5f176ebd 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_directory_client.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_directory_client.py @@ -118,8 +118,7 @@ def __init__( # type: ignore sas_token, credential, share_snapshot=self.snapshot) super(ShareDirectoryClient, self).__init__(parsed_url, service='file-share', credential=credential, **kwargs) self._client = AzureFileStorage(url=self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access @classmethod def from_directory_url(cls, directory_url, # type: str diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_file_client.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_file_client.py index 24d731fe7885..5f8f979d0376 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_file_client.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_file_client.py @@ -172,8 +172,7 @@ def __init__( # type: ignore sas_token, credential, share_snapshot=self.snapshot) super(ShareFileClient, self).__init__(parsed_url, service='file-share', credential=credential, **kwargs) self._client = AzureFileStorage(url=self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access @classmethod def from_file_url( diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_serialize.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_serialize.py index 6fa74259f62c..9a050dae3339 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_serialize.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_serialize.py @@ -14,6 +14,7 @@ _SUPPORTED_API_VERSIONS = [ '2019-02-02', '2019-07-07', + '2019-10-10', '2019-12-12', '2020-02-10', '2020-04-08', @@ -108,10 +109,11 @@ def get_smb_properties(kwargs): } -def get_api_version(kwargs, default): + +def get_api_version(kwargs): # type: (Dict[str, Any]) -> str - api_version = kwargs.pop('api_version', None) + api_version = kwargs.get('api_version', None) if api_version and api_version not in _SUPPORTED_API_VERSIONS: versions = '\n'.join(_SUPPORTED_API_VERSIONS) raise ValueError("Unsupported API version '{}'. Please select from:\n{}".format(api_version, versions)) - return api_version or default + return api_version or _SUPPORTED_API_VERSIONS[-1] diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py index 3d9f707973b9..a0b317bde7ef 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_client.py @@ -115,8 +115,7 @@ def __init__( # type: ignore sas_token, credential, share_snapshot=self.snapshot) super(ShareClient, self).__init__(parsed_url, service='file-share', credential=credential, **kwargs) self._client = AzureFileStorage(url=self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access @classmethod def from_share_url(cls, share_url, # type: str diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_service_client.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_service_client.py index 3f2de840b603..537a0e5ee2fc 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_service_client.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_share_service_client.py @@ -105,8 +105,7 @@ def __init__( self._query_str, credential = self._format_query_string(sas_token, credential) super(ShareServiceClient, self).__init__(parsed_url, service='file-share', credential=credential, **kwargs) self._client = AzureFileStorage(url=self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access def _format_url(self, hostname): """Format the endpoint URL according to the current location diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py index 202620c82c6d..c9d0e6003207 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/_version.py @@ -4,4 +4,4 @@ # license information. # -------------------------------------------------------------------------- -VERSION = "12.6.0b1" +VERSION = "12.6.0" diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_directory_client_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_directory_client_async.py index 8da17a039362..ae7767da2a60 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_directory_client_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_directory_client_async.py @@ -90,8 +90,7 @@ def __init__( # type: ignore loop=loop, **kwargs) self._client = AzureFileStorage(url=self.url, pipeline=self._pipeline, loop=loop) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access self._loop = loop def get_file_client(self, file_name, **kwargs): diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_file_client_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_file_client_async.py index a5c936efc4b5..f4ee50fb1aad 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_file_client_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_file_client_async.py @@ -137,8 +137,7 @@ def __init__( # type: ignore credential=credential, loop=loop, **kwargs ) self._client = AzureFileStorage(url=self.url, pipeline=self._pipeline, loop=loop) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access self._loop = loop @distributed_trace_async diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py index 0d3d61778400..f8ded64403b5 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_client_async.py @@ -85,8 +85,7 @@ def __init__( # type: ignore loop=loop, **kwargs) self._client = AzureFileStorage(url=self.url, pipeline=self._pipeline, loop=loop) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access self._loop = loop def get_directory_client(self, directory_path=None): diff --git a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_service_client_async.py b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_service_client_async.py index d6df0334d5c1..dc9ef0823a3f 100644 --- a/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_service_client_async.py +++ b/sdk/storage/azure-storage-file-share/azure/storage/fileshare/aio/_share_service_client_async.py @@ -90,8 +90,7 @@ def __init__( loop=loop, **kwargs) self._client = AzureFileStorage(url=self.url, pipeline=self._pipeline, loop=loop) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = get_api_version(kwargs, default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access self._loop = loop @distributed_trace_async diff --git a/sdk/storage/azure-storage-file-share/setup.py b/sdk/storage/azure-storage-file-share/setup.py index af2e8d3ebf1a..752f8c5df2af 100644 --- a/sdk/storage/azure-storage-file-share/setup.py +++ b/sdk/storage/azure-storage-file-share/setup.py @@ -59,7 +59,7 @@ author_email='ascl@microsoft.com', url='https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-file-share', classifiers=[ - 'Development Status :: 4 - Beta', + "Development Status :: 5 - Production/Stable", 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py index 14ca7acf62d9..677105147ebe 100644 --- a/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py @@ -19,6 +19,7 @@ from azure.core.exceptions import HttpResponseError from azure.core.paging import ItemPaged from azure.core.tracing.decorator import distributed_trace +from ._serialize import get_api_version from ._shared.base_client import StorageAccountHostsMixin, parse_connection_str, parse_query from ._shared.request_handlers import add_metadata_headers, serialize_iso from ._shared.response_handlers import ( @@ -105,8 +106,7 @@ def __init__( self._config.message_encode_policy = kwargs.get('message_encode_policy', None) or NoEncodePolicy() self._config.message_decode_policy = kwargs.get('message_decode_policy', None) or NoDecodePolicy() self._client = AzureQueueStorage(self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = kwargs.get('api_version', default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access def _format_url(self, hostname): """Format the endpoint URL according to the current location diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_service_client.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_service_client.py index cdaf88032695..ee4595fb74eb 100644 --- a/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_service_client.py +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_service_client.py @@ -17,6 +17,7 @@ from azure.core.paging import ItemPaged from azure.core.pipeline import Pipeline from azure.core.tracing.decorator import distributed_trace +from ._serialize import get_api_version from ._shared.models import LocationMode from ._shared.base_client import StorageAccountHostsMixin, TransportWrapper, parse_connection_str, parse_query from ._shared.response_handlers import process_storage_error @@ -108,8 +109,7 @@ def __init__( self._query_str, credential = self._format_query_string(sas_token, credential) super(QueueServiceClient, self).__init__(parsed_url, service='queue', credential=credential, **kwargs) self._client = AzureQueueStorage(self.url, pipeline=self._pipeline) - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = kwargs.get('api_version', default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access def _format_url(self, hostname): """Format the endpoint URL according to the current location diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_serialize.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_serialize.py new file mode 100644 index 000000000000..6aafbc170bec --- /dev/null +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_serialize.py @@ -0,0 +1,26 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +_SUPPORTED_API_VERSIONS = [ + '2019-02-02', + '2019-07-07', + '2019-10-10', + '2019-12-12', + '2020-02-10', + '2020-04-08', + '2020-06-12', + '2020-08-04', + '2020-10-02' +] + + +def get_api_version(kwargs): + # type: (Dict[str, Any], str) -> str + api_version = kwargs.get('api_version', None) + if api_version and api_version not in _SUPPORTED_API_VERSIONS: + versions = '\n'.join(_SUPPORTED_API_VERSIONS) + raise ValueError("Unsupported API version '{}'. Please select from:\n{}".format(api_version, versions)) + return api_version or _SUPPORTED_API_VERSIONS[-1] diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py b/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py index 34ecba6b6fe2..4b8f3f0c4282 100644 --- a/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py @@ -31,6 +31,7 @@ from azure.core.async_paging import AsyncItemPaged +from .._serialize import get_api_version from .._shared.base_client_async import AsyncStorageAccountHostsMixin from .._shared.request_handlers import add_metadata_headers, serialize_iso from .._shared.response_handlers import ( @@ -111,8 +112,7 @@ def __init__( account_url, queue_name=queue_name, credential=credential, loop=loop, **kwargs ) self._client = AzureQueueStorage(self.url, pipeline=self._pipeline, loop=loop) # type: ignore - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = kwargs.get('api_version', default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access self._loop = loop @distributed_trace_async diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_service_client_async.py b/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_service_client_async.py index 805ed41b7cc5..ee0fc0f8af22 100644 --- a/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_service_client_async.py +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_service_client_async.py @@ -20,6 +20,7 @@ from azure.core.pipeline import AsyncPipeline from azure.core.tracing.decorator_async import distributed_trace_async +from .._serialize import get_api_version from .._shared.policies_async import ExponentialRetry from .._queue_service_client import QueueServiceClient as QueueServiceClientBase from .._shared.models import LocationMode @@ -101,8 +102,7 @@ def __init__( loop=loop, **kwargs) self._client = AzureQueueStorage(url=self.url, pipeline=self._pipeline, loop=loop) # type: ignore - default_api_version = self._client._config.version # pylint: disable=protected-access - self._client._config.version = kwargs.get('api_version', default_api_version) # pylint: disable=protected-access + self._client._config.version = get_api_version(kwargs) # pylint: disable=protected-access self._loop = loop @distributed_trace_async diff --git a/sdk/storage/azure-storage-queue/tests/test_queue_client.py b/sdk/storage/azure-storage-queue/tests/test_queue_client.py index 75fe784dbf5a..7cc6926f5108 100644 --- a/sdk/storage/azure-storage-queue/tests/test_queue_client.py +++ b/sdk/storage/azure-storage-queue/tests/test_queue_client.py @@ -12,6 +12,7 @@ QueueServiceClient, QueueClient, ) +from azure.storage.queue._serialize import _SUPPORTED_API_VERSIONS from _shared.testcase import GlobalStorageAccountPreparer, StorageTestCase # ------------------------------------------------------------------------------ @@ -484,6 +485,21 @@ def test_closing_pipeline_client_simple(self, resource_group, location, storage_ service = client( self.account_url(storage_account, "queue"), credential=storage_account_key, queue_name='queue') service.close() + + @GlobalStorageAccountPreparer() + def test_queue_client_api_version(self, resource_group, location, storage_account, storage_account_key): + newest_api_version = _SUPPORTED_API_VERSIONS[-1] + queue_client = QueueClient("https://abc.queue.core.windows.net", "myqueue", "fake_key") + queue_service_client = QueueServiceClient("https://abc.queue.core.windows.net", "fake_key") + self.assertEqual(queue_client.api_version, newest_api_version) + self.assertEqual(queue_service_client.api_version, newest_api_version) + + queue_client2 = QueueClient("https://abc.queue.core.windows.net", "myqueue", "fake_key", api_version="2019-02-02") + queue_service_client2 = QueueServiceClient("https://abc.queue.core.windows.net", "fake_key") + self.assertEqual(queue_client2.api_version, "2019-02-02") + self.assertEqual(queue_service_client2.api_version, "2019-02-02") + + # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() diff --git a/sdk/storage/azure-storage-queue/tests/test_queue_client_async.py b/sdk/storage/azure-storage-queue/tests/test_queue_client_async.py index 9710c3eb3305..fee6c017f5da 100644 --- a/sdk/storage/azure-storage-queue/tests/test_queue_client_async.py +++ b/sdk/storage/azure-storage-queue/tests/test_queue_client_async.py @@ -15,6 +15,7 @@ QueueServiceClient, QueueClient ) +from azure.storage.queue._serialize import _SUPPORTED_API_VERSIONS from _shared.asynctestcase import AsyncStorageTestCase from _shared.testcase import GlobalStorageAccountPreparer # ------------------------------------------------------------------------------ @@ -482,6 +483,19 @@ async def test_closing_pipeline_client_simple_async(self, resource_group, locati self.account_url(storage_account, "queue"), credential=storage_account_key, queue_name='queue') await service.close() + @GlobalStorageAccountPreparer() + def test_queue_client_api_version(self, resource_group, location, storage_account, storage_account_key): + newest_api_version = _SUPPORTED_API_VERSIONS[-1] + queue_client = QueueClient("https://abc.queue.core.windows.net", "myqueue", "fake_key") + queue_service_client = QueueServiceClient("https://abc.queue.core.windows.net", "fake_key") + self.assertEqual(queue_client.api_version, newest_api_version) + self.assertEqual(queue_service_client.api_version, newest_api_version) + + queue_client2 = QueueClient("https://abc.queue.core.windows.net", "myqueue", "fake_key", api_version="2019-02-02") + queue_service_client2 = QueueServiceClient("https://abc.queue.core.windows.net", "fake_key") + self.assertEqual(queue_client2.api_version, "2019-02-02") + self.assertEqual(queue_service_client2.api_version, "2019-02-02") + # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() From 932f049584b0534fa9f44dd3f358a0b4a1402535 Mon Sep 17 00:00:00 2001 From: xiafu Date: Thu, 16 Sep 2021 10:51:20 -0700 Subject: [PATCH 2/2] fix test --- .../tests/test_queue_api_version.py | 5 +++-- .../tests/test_queue_api_version_async.py | 5 +++-- .../azure-storage-queue/tests/test_queue_client.py | 13 ------------- .../tests/test_queue_client_async.py | 12 ------------ 4 files changed, 6 insertions(+), 29 deletions(-) diff --git a/sdk/storage/azure-storage-queue/tests/test_queue_api_version.py b/sdk/storage/azure-storage-queue/tests/test_queue_api_version.py index f03aaa5b2c68..55fc24674b21 100644 --- a/sdk/storage/azure-storage-queue/tests/test_queue_api_version.py +++ b/sdk/storage/azure-storage-queue/tests/test_queue_api_version.py @@ -13,6 +13,7 @@ QueueServiceClient, QueueClient ) +from azure.storage.queue._serialize import _SUPPORTED_API_VERSIONS from _shared.testcase import GlobalStorageAccountPreparer, StorageTestCase # ------------------------------------------------------------------------------ @@ -21,7 +22,7 @@ class StorageClientTest(StorageTestCase): def setUp(self): super(StorageClientTest, self).setUp() self.api_version_1 = "2019-02-02" - self.api_version_2 = '2018-03-28' + self.api_version_2 = _SUPPORTED_API_VERSIONS[-1] # --Test Cases-------------------------------------------------------------- @@ -46,7 +47,7 @@ def test_service_client_api_version_property(self): self.assertEqual(queue_client.api_version, self.api_version_1) self.assertEqual(queue_client._client._config.version, self.api_version_1) - def test_blob_client_api_version_property(self): + def test_queue_client_api_version_property(self): queue_client = QueueClient( "https://foo.queue.core.windows.net/account", "queue_name", diff --git a/sdk/storage/azure-storage-queue/tests/test_queue_api_version_async.py b/sdk/storage/azure-storage-queue/tests/test_queue_api_version_async.py index 6433f57fa043..b397846355e7 100644 --- a/sdk/storage/azure-storage-queue/tests/test_queue_api_version_async.py +++ b/sdk/storage/azure-storage-queue/tests/test_queue_api_version_async.py @@ -13,6 +13,7 @@ QueueServiceClient, QueueClient ) +from azure.storage.queue._serialize import _SUPPORTED_API_VERSIONS from _shared.testcase import GlobalStorageAccountPreparer from _shared.asynctestcase import AsyncStorageTestCase @@ -22,7 +23,7 @@ class StorageClientTest(AsyncStorageTestCase): def setUp(self): super(StorageClientTest, self).setUp() self.api_version_1 = "2019-02-02" - self.api_version_2 = '2018-03-28' + self.api_version_2 = _SUPPORTED_API_VERSIONS[-1] # --Test Cases-------------------------------------------------------------- @@ -47,7 +48,7 @@ def test_service_client_api_version_property(self): self.assertEqual(queue_client.api_version, self.api_version_1) self.assertEqual(queue_client._client._config.version, self.api_version_1) - def test_blob_client_api_version_property(self): + def test_queue_client_api_version_property(self): queue_client = QueueClient( "https://foo.queue.core.windows.net/account", "queue_name", diff --git a/sdk/storage/azure-storage-queue/tests/test_queue_client.py b/sdk/storage/azure-storage-queue/tests/test_queue_client.py index 7cc6926f5108..5bea41109afe 100644 --- a/sdk/storage/azure-storage-queue/tests/test_queue_client.py +++ b/sdk/storage/azure-storage-queue/tests/test_queue_client.py @@ -486,19 +486,6 @@ def test_closing_pipeline_client_simple(self, resource_group, location, storage_ self.account_url(storage_account, "queue"), credential=storage_account_key, queue_name='queue') service.close() - @GlobalStorageAccountPreparer() - def test_queue_client_api_version(self, resource_group, location, storage_account, storage_account_key): - newest_api_version = _SUPPORTED_API_VERSIONS[-1] - queue_client = QueueClient("https://abc.queue.core.windows.net", "myqueue", "fake_key") - queue_service_client = QueueServiceClient("https://abc.queue.core.windows.net", "fake_key") - self.assertEqual(queue_client.api_version, newest_api_version) - self.assertEqual(queue_service_client.api_version, newest_api_version) - - queue_client2 = QueueClient("https://abc.queue.core.windows.net", "myqueue", "fake_key", api_version="2019-02-02") - queue_service_client2 = QueueServiceClient("https://abc.queue.core.windows.net", "fake_key") - self.assertEqual(queue_client2.api_version, "2019-02-02") - self.assertEqual(queue_service_client2.api_version, "2019-02-02") - # ------------------------------------------------------------------------------ if __name__ == '__main__': diff --git a/sdk/storage/azure-storage-queue/tests/test_queue_client_async.py b/sdk/storage/azure-storage-queue/tests/test_queue_client_async.py index fee6c017f5da..d2c91d8c29b8 100644 --- a/sdk/storage/azure-storage-queue/tests/test_queue_client_async.py +++ b/sdk/storage/azure-storage-queue/tests/test_queue_client_async.py @@ -483,18 +483,6 @@ async def test_closing_pipeline_client_simple_async(self, resource_group, locati self.account_url(storage_account, "queue"), credential=storage_account_key, queue_name='queue') await service.close() - @GlobalStorageAccountPreparer() - def test_queue_client_api_version(self, resource_group, location, storage_account, storage_account_key): - newest_api_version = _SUPPORTED_API_VERSIONS[-1] - queue_client = QueueClient("https://abc.queue.core.windows.net", "myqueue", "fake_key") - queue_service_client = QueueServiceClient("https://abc.queue.core.windows.net", "fake_key") - self.assertEqual(queue_client.api_version, newest_api_version) - self.assertEqual(queue_service_client.api_version, newest_api_version) - - queue_client2 = QueueClient("https://abc.queue.core.windows.net", "myqueue", "fake_key", api_version="2019-02-02") - queue_service_client2 = QueueServiceClient("https://abc.queue.core.windows.net", "fake_key") - self.assertEqual(queue_client2.api_version, "2019-02-02") - self.assertEqual(queue_service_client2.api_version, "2019-02-02") # ------------------------------------------------------------------------------ if __name__ == '__main__':