diff --git a/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml index bb28feabbf00..7d7ac1159c42 100644 --- a/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml +++ b/sdk/storage/azure-storage-blob/tests/recordings/test_blob_service_properties.test_set_static_website_props_dont_impact_other_props.yaml @@ -16,25 +16,23 @@ interactions: Content-Type: - application/xml; charset=utf-8 User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:24:15 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: - content-length: - - '0' date: - - Fri, 25 Oct 2019 17:53:53 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:24:19 GMT + transfer-encoding: + - chunked x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 202 message: Accepted @@ -48,30 +46,28 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:24:25 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsetrueindex.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsefalsefalse" headers: content-type: - application/xml date: - - Fri, 25 Oct 2019 17:53:53 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:24:27 GMT transfer-encoding: - chunked vary: - Origin x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 200 message: OK @@ -91,25 +87,23 @@ interactions: Content-Type: - application/xml; charset=utf-8 User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:46:46 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: PUT uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: string: '' headers: - content-length: - - '0' date: - - Fri, 25 Oct 2019 17:53:54 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:46:49 GMT + transfer-encoding: + - chunked x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 202 message: Accepted @@ -123,30 +117,28 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-storage-blob/12.0.0b5 Python/3.6.3 (Windows-10-10.0.18362-SP0) + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) x-ms-date: - - Fri, 25 Oct 2019 17:53:54 GMT + - Thu, 10 Dec 2020 17:46:49 GMT x-ms-version: - - '2019-02-02' + - '2020-04-08' method: GET uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties response: body: - string: "\uFEFF1.0truetruetruetrue51.0truetruetrue51.0truetruetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsetrueindex.htmlerrors/error/404error.html2014-02-14" + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500falsefalsetrueindex.htmlerrors/error/404error.html" headers: content-type: - application/xml date: - - Fri, 25 Oct 2019 17:53:54 GMT - server: - - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + - Thu, 10 Dec 2020 17:46:50 GMT transfer-encoding: - chunked vary: - Origin x-ms-version: - - '2019-02-02' + - '2020-04-08' status: code: 200 message: OK diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py index 02a7559f5b27..c5e918819b78 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/__init__.py @@ -36,6 +36,11 @@ AccessControlChangeCounters, AccessControlChangeFailure, AccessControlChanges, + AnalyticsLogging, + Metrics, + RetentionPolicy, + StaticWebsite, + CorsRule ) from ._shared_access_signature import generate_account_sas, generate_file_system_sas, generate_directory_sas, \ @@ -87,5 +92,10 @@ 'DataLakeFileQueryError', 'ArrowDialect', 'ArrowType', - 'DataLakeFileQueryError' + 'DataLakeFileQueryError', + 'AnalyticsLogging', + 'Metrics', + 'RetentionPolicy', + 'StaticWebsite', + 'CorsRule' ] 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 f9e625c75119..b8cc3dc71121 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 @@ -3,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Any +from typing import Optional, List, Dict, Any try: from urllib.parse import urlparse @@ -15,10 +15,12 @@ from azure.storage.blob import BlobServiceClient from ._shared.base_client import TransportWrapper, StorageAccountHostsMixin, parse_query, parse_connection_str +from ._deserialize import get_datalake_service_properties from ._file_system_client import FileSystemClient from ._data_lake_directory_client import DataLakeDirectoryClient from ._data_lake_file_client import DataLakeFileClient -from ._models import UserDelegationKey, FileSystemPropertiesPaged, LocationMode +from ._models import UserDelegationKey, FileSystemPropertiesPaged, LocationMode, AnalyticsLogging, \ + CorsRule, RetentionPolicy, StaticWebsite, Metrics from ._serialize import convert_dfs_url_to_blob_url @@ -462,7 +464,7 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] or an instance of FileProperties. eg. directory/subdirectory/file :type file_path: str or ~azure.storage.filedatalake.FileProperties :returns: A DataLakeFileClient. - :rtype: ~azure.storage.filedatalake..DataLakeFileClient + :rtype: ~azure.storage.filedatalake.DataLakeFileClient .. admonition:: Example: @@ -492,3 +494,80 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + def set_service_properties( + self, analytics_logging=None, # type: Optional[AnalyticsLogging] + hour_metrics=None, # type: Optional[Metrics] + minute_metrics=None, # type: Optional[Metrics] + cors=None, # type: Optional[List[CorsRule]] + target_version=None, # type: Optional[str] + delete_retention_policy=None, # type: Optional[RetentionPolicy] + static_website=None, # type: Optional[StaticWebsite] + **kwargs + ): + # type: (...) -> None + """Sets the properties of a storage account's Datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + If an element (e.g. analytics_logging) is left as None, the + existing settings on the service for that functionality are preserved. + + :param analytics_logging: + Groups the Azure Analytics Logging settings. + :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging + :param hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates. + :type hour_metrics: ~azure.storage.filedatalake.Metrics + :param minute_metrics: + The minute metrics settings provide request statistics + for each minute. + :type minute_metrics: ~azure.storage.filedatalake.Metrics + :param cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list[~azure.storage.filedatalake.CorsRule] + :param str target_version: + Indicates the default version to use for requests if an incoming + request's version is not specified. + :param delete_retention_policy: + The delete retention policy specifies whether to retain deleted files/directories. + It also specifies the number of days and versions of file/directory to keep. + :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy + :param static_website: + Specifies whether the static website feature is enabled, + and if yes, indicates the index document and 404 error document to use. + :type static_website: ~azure.storage.filedatalake.StaticWebsite + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + """ + return self._blob_service_client.set_service_properties(analytics_logging=analytics_logging, + hour_metrics=hour_metrics, + minute_metrics=minute_metrics, + cors=cors, + target_version=target_version, + delete_retention_policy=delete_retention_policy, + static_website=static_website, + **kwargs) # pylint: disable=protected-access + + def get_service_properties(self, **kwargs): + # type: (Any) -> Dict[str, Any] + """Gets the properties of a storage account's datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An object containing datalake service properties such as + analytics logging, hour/minute metrics, cors rules, etc. + :rtype: Dict[str, Any] + """ + props = self._blob_service_client.get_service_properties(**kwargs) # pylint: disable=protected-access + return get_datalake_service_properties(props) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py index dfcaf8ef5dde..18ec80fd44f7 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_deserialize.py @@ -12,7 +12,8 @@ from azure.core.pipeline.policies import ContentDecodePolicy from azure.core.exceptions import HttpResponseError, DecodeError, ResourceModifiedError, ClientAuthenticationError, \ ResourceNotFoundError, ResourceExistsError -from ._models import FileProperties, DirectoryProperties, LeaseProperties, PathProperties +from ._models import FileProperties, DirectoryProperties, LeaseProperties, DeletedPathProperties, StaticWebsite, \ + RetentionPolicy, Metrics, AnalyticsLogging, PathProperties # pylint: disable=protected-access from ._shared.models import StorageErrorCode if TYPE_CHECKING: @@ -48,6 +49,34 @@ def deserialize_path_properties(path_list): return [PathProperties._from_generated(path) for path in path_list] # pylint: disable=protected-access +def get_deleted_path_properties_from_generated_code(generated): + deleted_path = DeletedPathProperties() + deleted_path.name = generated.name + deleted_path.deleted_time = generated.properties.deleted_time + deleted_path.remaining_retention_days = generated.properties.remaining_retention_days + deleted_path.deletion_id = generated.deletion_id + return deleted_path + + +def is_file_path(_, __, headers): + if headers['x-ms-resource-type'] == "file": + return True + return False + + +def get_datalake_service_properties(datalake_properties): + datalake_properties["analytics_logging"] = AnalyticsLogging._from_generated( # pylint: disable=protected-access + datalake_properties["analytics_logging"]) + datalake_properties["hour_metrics"] = Metrics._from_generated(datalake_properties["hour_metrics"]) # pylint: disable=protected-access + datalake_properties["minute_metrics"] = Metrics._from_generated( # pylint: disable=protected-access + datalake_properties["minute_metrics"]) + datalake_properties["delete_retention_policy"] = RetentionPolicy._from_generated( # pylint: disable=protected-access + datalake_properties["delete_retention_policy"]) + datalake_properties["static_website"] = StaticWebsite._from_generated( # pylint: disable=protected-access + datalake_properties["static_website"]) + return datalake_properties + + def from_blob_properties(blob_properties): file_props = FileProperties() file_props.name = blob_properties.name @@ -64,6 +93,7 @@ def from_blob_properties(blob_properties): file_props.content_settings = blob_properties.content_settings return file_props + def normalize_headers(headers): normalized = {} for key, value in headers.items(): 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 0c0fbc36673e..ece2986def6f 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 @@ -3,26 +3,32 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Optional, Any +import functools +from typing import Optional, Any, Union + try: - from urllib.parse import urlparse, quote + from urllib.parse import urlparse, quote, unquote except ImportError: from urlparse import urlparse # type: ignore - from urllib2 import quote # type: ignore - + from urllib2 import quote, unquote # type: ignore import six + from azure.core.pipeline import Pipeline +from azure.core.exceptions import HttpResponseError 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 ._models import LocationMode, FileSystemProperties, PublicAccess, FileProperties, DirectoryProperties +from ._list_paths_helper import DeletedPathPropertiesPaged +from ._models import LocationMode, FileSystemProperties, PublicAccess, DeletedPathProperties, FileProperties, \ + DirectoryProperties from ._data_lake_file_client import DataLakeFileClient from ._data_lake_directory_client import DataLakeDirectoryClient from ._data_lake_lease import DataLakeLeaseClient from ._generated import AzureDataLakeStorageRESTAPI -from ._deserialize import deserialize_path_properties +from ._generated.models import ListBlobsIncludeItem +from ._deserialize import deserialize_path_properties, process_storage_error, is_file_path class FileSystemClient(StorageAccountHostsMixin): @@ -99,6 +105,9 @@ 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) + self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url, + file_system=file_system_name, + pipeline=self._pipeline) def _format_url(self, hostname): file_system_name = self.file_system_name @@ -740,6 +749,53 @@ def delete_file(self, file, # type: Union[FileProperties, str] file_client.delete_file(**kwargs) return file_client + def _undelete_path(self, deleted_path_name, deletion_id): + quoted_path = quote(unquote(deleted_path_name.strip('/'))) + + url_and_token = self.url.replace('.dfs.', '.blob.').split('?') + try: + url = url_and_token[0] + '/' + quoted_path + url_and_token[1] + except IndexError: + url = url_and_token[0] + '/' + quoted_path + + undelete_source = quoted_path + '?deletionid={}'.format(deletion_id) if deletion_id else None + + return quoted_path, url, undelete_source + + def undelete_path(self, deleted_path_name, deletion_id, **kwargs): + # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient] + """Restores soft-deleted path. + + Operation will only be successful if used within the specified number of days + set in the delete retention policy. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str deleted_path_name: + Specifies the path (file or directory) to restore. + :param str deletion_id: + Specifies the version of the deleted path to restore. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: ~azure.storage.file.datalake.DataLakeDirectoryClient or azure.storage.file.datalake.DataLakeFileClient + """ + _, url, undelete_source = self._undelete_path(deleted_path_name, deletion_id) + + pipeline = Pipeline( + transport=TransportWrapper(self._pipeline._transport), # pylint: disable = protected-access + policies=self._pipeline._impl_policies # pylint: disable = protected-access + ) + path_client = AzureDataLakeStorageRESTAPI( + url, filesystem=self.file_system_name, path=deleted_path_name, pipeline=pipeline) + try: + is_file = path_client.path.undelete(undelete_source=undelete_source, cls=is_file_path, **kwargs) + if is_file: + return self.get_file_client(deleted_path_name) + return self.get_directory_client(deleted_path_name) + except HttpResponseError as error: + process_storage_error(error) + def _get_root_directory_client(self): # type: () -> DataLakeDirectoryClient """Get a client to interact with the root directory. @@ -801,7 +857,7 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] or an instance of FileProperties. eg. directory/subdirectory/file :type file_path: str or ~azure.storage.filedatalake.FileProperties :returns: A DataLakeFileClient. - :rtype: ~azure.storage.filedatalake..DataLakeFileClient + :rtype: ~azure.storage.filedatalake.DataLakeFileClient .. admonition:: Example: @@ -826,3 +882,36 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + def get_deleted_paths(self, + name_starts_with=None, # type: Optional[str], + **kwargs): + # type: (...) -> ItemPaged[DeletedPathProperties] + """Returns a generator to list the paths(could be files or directories) under the specified file system. + The generator will lazily follow the continuation tokens returned by + the service. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str name_starts_with: + Filters the results to return only paths under the specified path. + :keyword int max_results: + An optional value that specifies the maximum number of items to return per page. + If omitted or greater than 5,000, the response will include up to 5,000 items per page. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An iterable (auto-paging) response of PathProperties. + :rtype: + ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] + """ + results_per_page = kwargs.pop('max_results', None) + timeout = kwargs.pop('timeout', None) + command = functools.partial( + self._datalake_client_for_blob_operation.file_system.list_blob_hierarchy_segment, + showonly=ListBlobsIncludeItem.deleted, + timeout=timeout, + **kwargs) + return ItemPaged( + command, prefix=name_starts_with, page_iterator_class=DeletedPathPropertiesPaged, + results_per_page=results_per_page, **kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py index efb21f39026f..fbd0a7916e69 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_azure_data_lake_storage_restapi.py @@ -15,6 +15,8 @@ # pylint: disable=unused-import,ungrouped-imports from typing import Any + from azure.core.pipeline.transport import HttpRequest, HttpResponse + from ._configuration import AzureDataLakeStorageRESTAPIConfiguration from .operations import ServiceOperations from .operations import FileSystemOperations @@ -57,6 +59,24 @@ def __init__( self.path = PathOperations( self._client, self._config, self._serialize, self._deserialize) + def _send_request(self, http_request, **kwargs): + # type: (HttpRequest, Any) -> HttpResponse + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.HttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + def close(self): # type: () -> None self._client.close() diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py index e3dd7f17f1fd..3bfff366da7c 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/_configuration.py @@ -39,7 +39,7 @@ def __init__( self.url = url self.resource = "filesystem" - self.version = "2020-02-10" + self.version = "2020-06-12" kwargs.setdefault('sdk_moniker', 'azuredatalakestoragerestapi/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py index 662a749523a6..efeeeb3b5361 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_azure_data_lake_storage_restapi.py @@ -9,6 +9,7 @@ from typing import Any from azure.core import AsyncPipelineClient +from azure.core.pipeline.transport import AsyncHttpResponse, HttpRequest from msrest import Deserializer, Serializer from ._configuration import AzureDataLakeStorageRESTAPIConfiguration @@ -52,6 +53,23 @@ def __init__( self.path = PathOperations( self._client, self._config, self._serialize, self._deserialize) + async def _send_request(self, http_request: HttpRequest, **kwargs: Any) -> AsyncHttpResponse: + """Runs the network request through the client's chained policies. + + :param http_request: The network request you want to make. Required. + :type http_request: ~azure.core.pipeline.transport.HttpRequest + :keyword bool stream: Whether the response payload will be streamed. Defaults to True. + :return: The response of your network call. Does not do error handling on your response. + :rtype: ~azure.core.pipeline.transport.AsyncHttpResponse + """ + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + http_request.url = self._client.format_url(http_request.url, **path_format_arguments) + stream = kwargs.pop("stream", True) + pipeline_response = await self._client._pipeline.run(http_request, stream=stream, **kwargs) + return pipeline_response.http_response + async def close(self) -> None: await self._client.close() diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py index e23526fd6f27..82234727a630 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/_configuration.py @@ -34,7 +34,7 @@ def __init__( self.url = url self.resource = "filesystem" - self.version = "2020-02-10" + self.version = "2020-06-12" kwargs.setdefault('sdk_moniker', 'azuredatalakestoragerestapi/{}'.format(VERSION)) self._configure(**kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py index b6732e350f3b..d4e206a6d054 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_file_system_operations.py @@ -6,7 +6,7 @@ # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- import datetime -from typing import Any, AsyncIterable, Callable, Dict, Generic, Optional, TypeVar +from typing import Any, AsyncIterable, Callable, Dict, Generic, List, Optional, TypeVar, Union import warnings from azure.core.async_paging import AsyncItemPaged, AsyncList @@ -108,7 +108,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -206,7 +206,7 @@ async def set_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -276,7 +276,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -370,7 +370,7 @@ async def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -443,8 +443,10 @@ def prepare_request(next_link=None, cont_token=None): # Construct headers header_parameters = {} # type: Dict[str, Any] if request_id_parameter is not None: - header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') - header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", + request_id_parameter, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, + 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') if not next_link: @@ -456,7 +458,8 @@ def prepare_request(next_link=None, cont_token=None): url = self._client.format_url(url, **path_format_arguments) # Construct parameters query_parameters = {} # type: Dict[str, Any] - query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, 'str') + query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, + 'str') if timeout is not None: query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) # TODO: change this once continuation/next_link autorest PR is merged @@ -502,7 +505,7 @@ async def get_next(cont_token=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) @@ -512,3 +515,117 @@ async def get_next(cont_token=None): get_next, extract_data ) list_paths.metadata = {'url': '/{filesystem}'} # type: ignore + + async def list_blob_hierarchy_segment( + self, + prefix: Optional[str] = None, + delimiter: Optional[str] = None, + marker: Optional[str] = None, + max_results: Optional[int] = None, + include: Optional[List[Union[str, "_models.ListBlobsIncludeItem"]]] = None, + showonly: Optional[str] = "deleted", + timeout: Optional[int] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> "_models.ListBlobsHierarchySegmentResponse": + """The List Blobs operation returns a list of the blobs under the specified container. + + :param prefix: Filters results to filesystems within the specified prefix. + :type prefix: str + :param delimiter: When the request includes this parameter, the operation returns a BlobPrefix + element in the response body that acts as a placeholder for all blobs whose names begin with + the same substring up to the appearance of the delimiter character. The delimiter may be a + single character or a string. + :type delimiter: str + :param marker: A string value that identifies the portion of the list of containers to be + returned with the next listing operation. The operation returns the NextMarker value within the + response body if the listing operation did not return all containers remaining to be listed + with the current page. The NextMarker value can be used as the value for the marker parameter + in a subsequent call to request the next page of list items. The marker value is opaque to the + client. + :type marker: str + :param max_results: An optional value that specifies the maximum number of items to return. If + omitted or greater than 5,000, the response will include up to 5,000 items. + :type max_results: int + :param include: Include this parameter to specify one or more datasets to include in the + response. + :type include: list[str or ~azure.storage.filedatalake.models.ListBlobsIncludeItem] + :param showonly: Include this parameter to specify one or more datasets to include in the + response. + :type showonly: str + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :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. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: ListBlobsHierarchySegmentResponse, or the result of cls(response) + :rtype: ~azure.storage.filedatalake.models.ListBlobsHierarchySegmentResponse + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType["_models.ListBlobsHierarchySegmentResponse"] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + restype = "container" + comp = "list" + accept = "application/xml" + + # Construct URL + url = self.list_blob_hierarchy_segment.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['restype'] = self._serialize.query("restype", restype, 'str') + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if prefix is not None: + query_parameters['prefix'] = self._serialize.query("prefix", prefix, 'str') + if delimiter is not None: + query_parameters['delimiter'] = self._serialize.query("delimiter", delimiter, 'str') + if marker is not None: + query_parameters['marker'] = self._serialize.query("marker", marker, 'str') + if max_results is not None: + query_parameters['maxResults'] = self._serialize.query("max_results", max_results, 'int', minimum=1) + if include is not None: + query_parameters['include'] = self._serialize.query("include", include, '[str]', div=',') + if showonly is not None: + query_parameters['showonly'] = self._serialize.query("showonly", showonly, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['Content-Type']=self._deserialize('str', response.headers.get('Content-Type')) + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + deserialized = self._deserialize('ListBlobsHierarchySegmentResponse', pipeline_response) + + if cls: + return cls(pipeline_response, deserialized, response_headers) + + return deserialized + list_blob_hierarchy_segment.metadata = {'url': '/{filesystem}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py index b090bc10952e..7cec5890e122 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_path_operations.py @@ -239,7 +239,7 @@ async def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -284,10 +284,10 @@ async def update( Uploads data to be appended to a file, flushes (writes) previously uploaded data to a file, sets properties for a file or directory, or sets access control for a file or directory. Data - can only be appended to a file. This operation supports conditional HTTP requests. For more - information, see `Specifying Conditional Headers for Blob Service Operations - `_. + can only be appended to a file. Concurrent writes to the same file using multiple clients are + not supported. This operation supports conditional HTTP requests. For more information, see + `Specifying Conditional Headers for Blob Service Operations `_. :param action: The action must be "append" to upload data to be appended to a file, "flush" to flush previously uploaded data to a file, "setProperties" to set the properties of a file or @@ -499,7 +499,7 @@ async def update( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -654,7 +654,7 @@ async def lease( if response.status_code not in [200, 201, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -787,7 +787,7 @@ async def read( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -947,7 +947,7 @@ async def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1080,7 +1080,7 @@ async def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1088,6 +1088,7 @@ async def delete( response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) response_headers['x-ms-continuation']=self._deserialize('str', response.headers.get('x-ms-continuation')) + response_headers['x-ms-deletion-id']=self._deserialize('str', response.headers.get('x-ms-deletion-id')) if cls: return cls(pipeline_response, None, response_headers) @@ -1203,7 +1204,7 @@ async def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1313,7 +1314,7 @@ async def set_access_control_recursive( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1481,7 +1482,7 @@ async def flush_data( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1599,7 +1600,7 @@ async def append_data( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1680,7 +1681,7 @@ async def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1695,3 +1696,78 @@ async def set_expiry( return cls(pipeline_response, None, response_headers) set_expiry.metadata = {'url': '/{filesystem}/{path}'} # type: ignore + + async def undelete( + self, + timeout: Optional[int] = None, + undelete_source: Optional[str] = None, + request_id_parameter: Optional[str] = None, + **kwargs + ) -> None: + """Undelete a path that was previously soft deleted. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param undelete_source: Only for hierarchical namespace enabled accounts. Optional. The path of + the soft deleted blob to undelete. + :type undelete_source: str + :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. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "undelete" + accept = "application/json" + + # Construct URL + url = self.undelete.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + if undelete_source is not None: + header_parameters['x-ms-undelete-source'] = self._serialize.header("undelete_source", undelete_source, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = await self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-resource-type']=self._deserialize('str', response.headers.get('x-ms-resource-type')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + undelete.metadata = {'url': '/{filesystem}/{path}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py index b229c1208668..f8ae878a37c3 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/aio/operations/_service_operations.py @@ -136,7 +136,7 @@ async def get_next(next_link=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py index 769623c0eee9..fc4548f39b19 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/__init__.py @@ -8,9 +8,14 @@ try: from ._models_py3 import AclFailedEntry + from ._models_py3 import BlobHierarchyListSegment + from ._models_py3 import BlobItemInternal + from ._models_py3 import BlobPrefix + from ._models_py3 import BlobPropertiesInternal from ._models_py3 import FileSystem from ._models_py3 import FileSystemList from ._models_py3 import LeaseAccessConditions + from ._models_py3 import ListBlobsHierarchySegmentResponse from ._models_py3 import ModifiedAccessConditions from ._models_py3 import Path from ._models_py3 import PathHTTPHeaders @@ -18,12 +23,17 @@ from ._models_py3 import SetAccessControlRecursiveResponse from ._models_py3 import SourceModifiedAccessConditions from ._models_py3 import StorageError - from ._models_py3 import StorageErrorAutoGenerated + from ._models_py3 import StorageErrorError except (SyntaxError, ImportError): from ._models import AclFailedEntry # type: ignore + from ._models import BlobHierarchyListSegment # type: ignore + from ._models import BlobItemInternal # type: ignore + from ._models import BlobPrefix # type: ignore + from ._models import BlobPropertiesInternal # type: ignore from ._models import FileSystem # type: ignore from ._models import FileSystemList # type: ignore from ._models import LeaseAccessConditions # type: ignore + from ._models import ListBlobsHierarchySegmentResponse # type: ignore from ._models import ModifiedAccessConditions # type: ignore from ._models import Path # type: ignore from ._models import PathHTTPHeaders # type: ignore @@ -31,9 +41,10 @@ from ._models import SetAccessControlRecursiveResponse # type: ignore from ._models import SourceModifiedAccessConditions # type: ignore from ._models import StorageError # type: ignore - from ._models import StorageErrorAutoGenerated # type: ignore + from ._models import StorageErrorError # type: ignore from ._azure_data_lake_storage_restapi_enums import ( + ListBlobsIncludeItem, PathExpiryOptions, PathGetPropertiesAction, PathLeaseAction, @@ -45,9 +56,14 @@ __all__ = [ 'AclFailedEntry', + 'BlobHierarchyListSegment', + 'BlobItemInternal', + 'BlobPrefix', + 'BlobPropertiesInternal', 'FileSystem', 'FileSystemList', 'LeaseAccessConditions', + 'ListBlobsHierarchySegmentResponse', 'ModifiedAccessConditions', 'Path', 'PathHTTPHeaders', @@ -55,7 +71,8 @@ 'SetAccessControlRecursiveResponse', 'SourceModifiedAccessConditions', 'StorageError', - 'StorageErrorAutoGenerated', + 'StorageErrorError', + 'ListBlobsIncludeItem', 'PathExpiryOptions', 'PathGetPropertiesAction', 'PathLeaseAction', diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py index e9fe9d71a62c..804050e9e0d0 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_azure_data_lake_storage_restapi_enums.py @@ -26,6 +26,16 @@ def __getattr__(cls, name): raise AttributeError(name) +class ListBlobsIncludeItem(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): + + COPY = "copy" + DELETED = "deleted" + METADATA = "metadata" + SNAPSHOTS = "snapshots" + UNCOMMITTEDBLOBS = "uncommittedblobs" + VERSIONS = "versions" + TAGS = "tags" + class PathExpiryOptions(with_metaclass(_CaseInsensitiveEnumMeta, str, Enum)): NEVER_EXPIRE = "NeverExpire" diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py index 099e37c53bb2..237617a48a13 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models.py @@ -37,6 +37,263 @@ def __init__( self.error_message = kwargs.get('error_message', None) +class BlobHierarchyListSegment(msrest.serialization.Model): + """BlobHierarchyListSegment. + + All required parameters must be populated in order to send to Azure. + + :param blob_prefixes: + :type blob_prefixes: list[~azure.storage.filedatalake.models.BlobPrefix] + :param blob_items: Required. + :type blob_items: list[~azure.storage.filedatalake.models.BlobItemInternal] + """ + + _validation = { + 'blob_items': {'required': True}, + } + + _attribute_map = { + 'blob_prefixes': {'key': 'BlobPrefixes', 'type': '[BlobPrefix]'}, + 'blob_items': {'key': 'BlobItems', 'type': '[BlobItemInternal]'}, + } + _xml_map = { + 'name': 'Blobs' + } + + def __init__( + self, + **kwargs + ): + super(BlobHierarchyListSegment, self).__init__(**kwargs) + self.blob_prefixes = kwargs.get('blob_prefixes', None) + self.blob_items = kwargs['blob_items'] + + +class BlobItemInternal(msrest.serialization.Model): + """An Azure Storage blob. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + :param deleted: Required. + :type deleted: bool + :param snapshot: Required. + :type snapshot: str + :param version_id: + :type version_id: str + :param is_current_version: + :type is_current_version: bool + :param properties: Required. Properties of a blob. + :type properties: ~azure.storage.filedatalake.models.BlobPropertiesInternal + :param deletion_id: + :type deletion_id: str + """ + + _validation = { + 'name': {'required': True}, + 'deleted': {'required': True}, + 'snapshot': {'required': True}, + 'properties': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + 'deleted': {'key': 'Deleted', 'type': 'bool'}, + 'snapshot': {'key': 'Snapshot', 'type': 'str'}, + 'version_id': {'key': 'VersionId', 'type': 'str'}, + 'is_current_version': {'key': 'IsCurrentVersion', 'type': 'bool'}, + 'properties': {'key': 'Properties', 'type': 'BlobPropertiesInternal'}, + 'deletion_id': {'key': 'DeletionId', 'type': 'str'}, + } + _xml_map = { + 'name': 'Blob' + } + + def __init__( + self, + **kwargs + ): + super(BlobItemInternal, self).__init__(**kwargs) + self.name = kwargs['name'] + self.deleted = kwargs['deleted'] + self.snapshot = kwargs['snapshot'] + self.version_id = kwargs.get('version_id', None) + self.is_current_version = kwargs.get('is_current_version', None) + self.properties = kwargs['properties'] + self.deletion_id = kwargs.get('deletion_id', None) + + +class BlobPrefix(msrest.serialization.Model): + """BlobPrefix. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + """ + + _validation = { + 'name': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + } + + def __init__( + self, + **kwargs + ): + super(BlobPrefix, self).__init__(**kwargs) + self.name = kwargs['name'] + + +class BlobPropertiesInternal(msrest.serialization.Model): + """Properties of a blob. + + All required parameters must be populated in order to send to Azure. + + :param creation_time: + :type creation_time: ~datetime.datetime + :param last_modified: Required. + :type last_modified: ~datetime.datetime + :param etag: Required. + :type etag: str + :param content_length: Size in bytes. + :type content_length: long + :param content_type: + :type content_type: str + :param content_encoding: + :type content_encoding: str + :param content_language: + :type content_language: str + :param content_md5: + :type content_md5: bytearray + :param content_disposition: + :type content_disposition: str + :param cache_control: + :type cache_control: str + :param blob_sequence_number: + :type blob_sequence_number: long + :param copy_id: + :type copy_id: str + :param copy_source: + :type copy_source: str + :param copy_progress: + :type copy_progress: str + :param copy_completion_time: + :type copy_completion_time: ~datetime.datetime + :param copy_status_description: + :type copy_status_description: str + :param server_encrypted: + :type server_encrypted: bool + :param incremental_copy: + :type incremental_copy: bool + :param destination_snapshot: + :type destination_snapshot: str + :param deleted_time: + :type deleted_time: ~datetime.datetime + :param remaining_retention_days: + :type remaining_retention_days: int + :param access_tier_inferred: + :type access_tier_inferred: bool + :param customer_provided_key_sha256: + :type customer_provided_key_sha256: str + :param encryption_scope: The name of the encryption scope under which the blob is encrypted. + :type encryption_scope: str + :param access_tier_change_time: + :type access_tier_change_time: ~datetime.datetime + :param tag_count: + :type tag_count: int + :param expires_on: + :type expires_on: ~datetime.datetime + :param is_sealed: + :type is_sealed: bool + :param last_accessed_on: + :type last_accessed_on: ~datetime.datetime + :param delete_time: + :type delete_time: ~datetime.datetime + """ + + _validation = { + 'last_modified': {'required': True}, + 'etag': {'required': True}, + } + + _attribute_map = { + 'creation_time': {'key': 'Creation-Time', 'type': 'rfc-1123'}, + 'last_modified': {'key': 'Last-Modified', 'type': 'rfc-1123'}, + 'etag': {'key': 'Etag', 'type': 'str'}, + 'content_length': {'key': 'Content-Length', 'type': 'long'}, + 'content_type': {'key': 'Content-Type', 'type': 'str'}, + 'content_encoding': {'key': 'Content-Encoding', 'type': 'str'}, + 'content_language': {'key': 'Content-Language', 'type': 'str'}, + 'content_md5': {'key': 'Content-MD5', 'type': 'bytearray'}, + 'content_disposition': {'key': 'Content-Disposition', 'type': 'str'}, + 'cache_control': {'key': 'Cache-Control', 'type': 'str'}, + 'blob_sequence_number': {'key': 'x-ms-blob-sequence-number', 'type': 'long'}, + 'copy_id': {'key': 'CopyId', 'type': 'str'}, + 'copy_source': {'key': 'CopySource', 'type': 'str'}, + 'copy_progress': {'key': 'CopyProgress', 'type': 'str'}, + 'copy_completion_time': {'key': 'CopyCompletionTime', 'type': 'rfc-1123'}, + 'copy_status_description': {'key': 'CopyStatusDescription', 'type': 'str'}, + 'server_encrypted': {'key': 'ServerEncrypted', 'type': 'bool'}, + 'incremental_copy': {'key': 'IncrementalCopy', 'type': 'bool'}, + 'destination_snapshot': {'key': 'DestinationSnapshot', 'type': 'str'}, + 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, + 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'access_tier_inferred': {'key': 'AccessTierInferred', 'type': 'bool'}, + 'customer_provided_key_sha256': {'key': 'CustomerProvidedKeySha256', 'type': 'str'}, + 'encryption_scope': {'key': 'EncryptionScope', 'type': 'str'}, + 'access_tier_change_time': {'key': 'AccessTierChangeTime', 'type': 'rfc-1123'}, + 'tag_count': {'key': 'TagCount', 'type': 'int'}, + 'expires_on': {'key': 'Expiry-Time', 'type': 'rfc-1123'}, + 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, + 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'delete_time': {'key': 'DeleteTime', 'type': 'rfc-1123'}, + } + _xml_map = { + 'name': 'Properties' + } + + def __init__( + self, + **kwargs + ): + super(BlobPropertiesInternal, self).__init__(**kwargs) + self.creation_time = kwargs.get('creation_time', None) + self.last_modified = kwargs['last_modified'] + self.etag = kwargs['etag'] + self.content_length = kwargs.get('content_length', None) + self.content_type = kwargs.get('content_type', None) + self.content_encoding = kwargs.get('content_encoding', None) + self.content_language = kwargs.get('content_language', None) + self.content_md5 = kwargs.get('content_md5', None) + self.content_disposition = kwargs.get('content_disposition', None) + self.cache_control = kwargs.get('cache_control', None) + self.blob_sequence_number = kwargs.get('blob_sequence_number', None) + self.copy_id = kwargs.get('copy_id', None) + self.copy_source = kwargs.get('copy_source', None) + self.copy_progress = kwargs.get('copy_progress', None) + self.copy_completion_time = kwargs.get('copy_completion_time', None) + self.copy_status_description = kwargs.get('copy_status_description', None) + self.server_encrypted = kwargs.get('server_encrypted', None) + self.incremental_copy = kwargs.get('incremental_copy', None) + self.destination_snapshot = kwargs.get('destination_snapshot', None) + self.deleted_time = kwargs.get('deleted_time', None) + self.remaining_retention_days = kwargs.get('remaining_retention_days', None) + self.access_tier_inferred = kwargs.get('access_tier_inferred', None) + self.customer_provided_key_sha256 = kwargs.get('customer_provided_key_sha256', None) + self.encryption_scope = kwargs.get('encryption_scope', None) + self.access_tier_change_time = kwargs.get('access_tier_change_time', None) + self.tag_count = kwargs.get('tag_count', None) + self.expires_on = kwargs.get('expires_on', None) + self.is_sealed = kwargs.get('is_sealed', None) + self.last_accessed_on = kwargs.get('last_accessed_on', None) + self.delete_time = kwargs.get('delete_time', None) + + class FileSystem(msrest.serialization.Model): """FileSystem. @@ -103,6 +360,64 @@ def __init__( self.lease_id = kwargs.get('lease_id', None) +class ListBlobsHierarchySegmentResponse(msrest.serialization.Model): + """An enumeration of blobs. + + All required parameters must be populated in order to send to Azure. + + :param service_endpoint: Required. + :type service_endpoint: str + :param container_name: Required. + :type container_name: str + :param prefix: + :type prefix: str + :param marker: + :type marker: str + :param max_results: + :type max_results: int + :param delimiter: + :type delimiter: str + :param segment: Required. + :type segment: ~azure.storage.filedatalake.models.BlobHierarchyListSegment + :param next_marker: + :type next_marker: str + """ + + _validation = { + 'service_endpoint': {'required': True}, + 'container_name': {'required': True}, + 'segment': {'required': True}, + } + + _attribute_map = { + 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'attr': True}}, + 'container_name': {'key': 'ContainerName', 'type': 'str', 'xml': {'attr': True}}, + 'prefix': {'key': 'Prefix', 'type': 'str'}, + 'marker': {'key': 'Marker', 'type': 'str'}, + 'max_results': {'key': 'MaxResults', 'type': 'int'}, + 'delimiter': {'key': 'Delimiter', 'type': 'str'}, + 'segment': {'key': 'Segment', 'type': 'BlobHierarchyListSegment'}, + 'next_marker': {'key': 'NextMarker', 'type': 'str'}, + } + _xml_map = { + 'name': 'EnumerationResults' + } + + def __init__( + self, + **kwargs + ): + super(ListBlobsHierarchySegmentResponse, self).__init__(**kwargs) + self.service_endpoint = kwargs['service_endpoint'] + self.container_name = kwargs['container_name'] + self.prefix = kwargs.get('prefix', None) + self.marker = kwargs.get('marker', None) + self.max_results = kwargs.get('max_results', None) + self.delimiter = kwargs.get('delimiter', None) + self.segment = kwargs['segment'] + self.next_marker = kwargs.get('next_marker', None) + + class ModifiedAccessConditions(msrest.serialization.Model): """Parameter group. @@ -319,11 +634,11 @@ class StorageError(msrest.serialization.Model): """StorageError. :param error: The service error response object. - :type error: ~azure.storage.filedatalake.models.StorageErrorAutoGenerated + :type error: ~azure.storage.filedatalake.models.StorageErrorError """ _attribute_map = { - 'error': {'key': 'error', 'type': 'StorageErrorAutoGenerated'}, + 'error': {'key': 'error', 'type': 'StorageErrorError'}, } def __init__( @@ -334,7 +649,7 @@ def __init__( self.error = kwargs.get('error', None) -class StorageErrorAutoGenerated(msrest.serialization.Model): +class StorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -352,6 +667,6 @@ def __init__( self, **kwargs ): - super(StorageErrorAutoGenerated, self).__init__(**kwargs) + super(StorageErrorError, self).__init__(**kwargs) self.code = kwargs.get('code', None) self.message = kwargs.get('message', None) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py index 337388d8d2f6..bbe361c5b9bb 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/models/_models_py3.py @@ -44,6 +44,307 @@ def __init__( self.error_message = error_message +class BlobHierarchyListSegment(msrest.serialization.Model): + """BlobHierarchyListSegment. + + All required parameters must be populated in order to send to Azure. + + :param blob_prefixes: + :type blob_prefixes: list[~azure.storage.filedatalake.models.BlobPrefix] + :param blob_items: Required. + :type blob_items: list[~azure.storage.filedatalake.models.BlobItemInternal] + """ + + _validation = { + 'blob_items': {'required': True}, + } + + _attribute_map = { + 'blob_prefixes': {'key': 'BlobPrefixes', 'type': '[BlobPrefix]'}, + 'blob_items': {'key': 'BlobItems', 'type': '[BlobItemInternal]'}, + } + _xml_map = { + 'name': 'Blobs' + } + + def __init__( + self, + *, + blob_items: List["BlobItemInternal"], + blob_prefixes: Optional[List["BlobPrefix"]] = None, + **kwargs + ): + super(BlobHierarchyListSegment, self).__init__(**kwargs) + self.blob_prefixes = blob_prefixes + self.blob_items = blob_items + + +class BlobItemInternal(msrest.serialization.Model): + """An Azure Storage blob. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + :param deleted: Required. + :type deleted: bool + :param snapshot: Required. + :type snapshot: str + :param version_id: + :type version_id: str + :param is_current_version: + :type is_current_version: bool + :param properties: Required. Properties of a blob. + :type properties: ~azure.storage.filedatalake.models.BlobPropertiesInternal + :param deletion_id: + :type deletion_id: str + """ + + _validation = { + 'name': {'required': True}, + 'deleted': {'required': True}, + 'snapshot': {'required': True}, + 'properties': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + 'deleted': {'key': 'Deleted', 'type': 'bool'}, + 'snapshot': {'key': 'Snapshot', 'type': 'str'}, + 'version_id': {'key': 'VersionId', 'type': 'str'}, + 'is_current_version': {'key': 'IsCurrentVersion', 'type': 'bool'}, + 'properties': {'key': 'Properties', 'type': 'BlobPropertiesInternal'}, + 'deletion_id': {'key': 'DeletionId', 'type': 'str'}, + } + _xml_map = { + 'name': 'Blob' + } + + def __init__( + self, + *, + name: str, + deleted: bool, + snapshot: str, + properties: "BlobPropertiesInternal", + version_id: Optional[str] = None, + is_current_version: Optional[bool] = None, + deletion_id: Optional[str] = None, + **kwargs + ): + super(BlobItemInternal, self).__init__(**kwargs) + self.name = name + self.deleted = deleted + self.snapshot = snapshot + self.version_id = version_id + self.is_current_version = is_current_version + self.properties = properties + self.deletion_id = deletion_id + + +class BlobPrefix(msrest.serialization.Model): + """BlobPrefix. + + All required parameters must be populated in order to send to Azure. + + :param name: Required. + :type name: str + """ + + _validation = { + 'name': {'required': True}, + } + + _attribute_map = { + 'name': {'key': 'Name', 'type': 'str'}, + } + + def __init__( + self, + *, + name: str, + **kwargs + ): + super(BlobPrefix, self).__init__(**kwargs) + self.name = name + + +class BlobPropertiesInternal(msrest.serialization.Model): + """Properties of a blob. + + All required parameters must be populated in order to send to Azure. + + :param creation_time: + :type creation_time: ~datetime.datetime + :param last_modified: Required. + :type last_modified: ~datetime.datetime + :param etag: Required. + :type etag: str + :param content_length: Size in bytes. + :type content_length: long + :param content_type: + :type content_type: str + :param content_encoding: + :type content_encoding: str + :param content_language: + :type content_language: str + :param content_md5: + :type content_md5: bytearray + :param content_disposition: + :type content_disposition: str + :param cache_control: + :type cache_control: str + :param blob_sequence_number: + :type blob_sequence_number: long + :param copy_id: + :type copy_id: str + :param copy_source: + :type copy_source: str + :param copy_progress: + :type copy_progress: str + :param copy_completion_time: + :type copy_completion_time: ~datetime.datetime + :param copy_status_description: + :type copy_status_description: str + :param server_encrypted: + :type server_encrypted: bool + :param incremental_copy: + :type incremental_copy: bool + :param destination_snapshot: + :type destination_snapshot: str + :param deleted_time: + :type deleted_time: ~datetime.datetime + :param remaining_retention_days: + :type remaining_retention_days: int + :param access_tier_inferred: + :type access_tier_inferred: bool + :param customer_provided_key_sha256: + :type customer_provided_key_sha256: str + :param encryption_scope: The name of the encryption scope under which the blob is encrypted. + :type encryption_scope: str + :param access_tier_change_time: + :type access_tier_change_time: ~datetime.datetime + :param tag_count: + :type tag_count: int + :param expires_on: + :type expires_on: ~datetime.datetime + :param is_sealed: + :type is_sealed: bool + :param last_accessed_on: + :type last_accessed_on: ~datetime.datetime + :param delete_time: + :type delete_time: ~datetime.datetime + """ + + _validation = { + 'last_modified': {'required': True}, + 'etag': {'required': True}, + } + + _attribute_map = { + 'creation_time': {'key': 'Creation-Time', 'type': 'rfc-1123'}, + 'last_modified': {'key': 'Last-Modified', 'type': 'rfc-1123'}, + 'etag': {'key': 'Etag', 'type': 'str'}, + 'content_length': {'key': 'Content-Length', 'type': 'long'}, + 'content_type': {'key': 'Content-Type', 'type': 'str'}, + 'content_encoding': {'key': 'Content-Encoding', 'type': 'str'}, + 'content_language': {'key': 'Content-Language', 'type': 'str'}, + 'content_md5': {'key': 'Content-MD5', 'type': 'bytearray'}, + 'content_disposition': {'key': 'Content-Disposition', 'type': 'str'}, + 'cache_control': {'key': 'Cache-Control', 'type': 'str'}, + 'blob_sequence_number': {'key': 'x-ms-blob-sequence-number', 'type': 'long'}, + 'copy_id': {'key': 'CopyId', 'type': 'str'}, + 'copy_source': {'key': 'CopySource', 'type': 'str'}, + 'copy_progress': {'key': 'CopyProgress', 'type': 'str'}, + 'copy_completion_time': {'key': 'CopyCompletionTime', 'type': 'rfc-1123'}, + 'copy_status_description': {'key': 'CopyStatusDescription', 'type': 'str'}, + 'server_encrypted': {'key': 'ServerEncrypted', 'type': 'bool'}, + 'incremental_copy': {'key': 'IncrementalCopy', 'type': 'bool'}, + 'destination_snapshot': {'key': 'DestinationSnapshot', 'type': 'str'}, + 'deleted_time': {'key': 'DeletedTime', 'type': 'rfc-1123'}, + 'remaining_retention_days': {'key': 'RemainingRetentionDays', 'type': 'int'}, + 'access_tier_inferred': {'key': 'AccessTierInferred', 'type': 'bool'}, + 'customer_provided_key_sha256': {'key': 'CustomerProvidedKeySha256', 'type': 'str'}, + 'encryption_scope': {'key': 'EncryptionScope', 'type': 'str'}, + 'access_tier_change_time': {'key': 'AccessTierChangeTime', 'type': 'rfc-1123'}, + 'tag_count': {'key': 'TagCount', 'type': 'int'}, + 'expires_on': {'key': 'Expiry-Time', 'type': 'rfc-1123'}, + 'is_sealed': {'key': 'Sealed', 'type': 'bool'}, + 'last_accessed_on': {'key': 'LastAccessTime', 'type': 'rfc-1123'}, + 'delete_time': {'key': 'DeleteTime', 'type': 'rfc-1123'}, + } + _xml_map = { + 'name': 'Properties' + } + + def __init__( + self, + *, + last_modified: datetime.datetime, + etag: str, + creation_time: Optional[datetime.datetime] = None, + content_length: Optional[int] = None, + content_type: Optional[str] = None, + content_encoding: Optional[str] = None, + content_language: Optional[str] = None, + content_md5: Optional[bytearray] = None, + content_disposition: Optional[str] = None, + cache_control: Optional[str] = None, + blob_sequence_number: Optional[int] = None, + copy_id: Optional[str] = None, + copy_source: Optional[str] = None, + copy_progress: Optional[str] = None, + copy_completion_time: Optional[datetime.datetime] = None, + copy_status_description: Optional[str] = None, + server_encrypted: Optional[bool] = None, + incremental_copy: Optional[bool] = None, + destination_snapshot: Optional[str] = None, + deleted_time: Optional[datetime.datetime] = None, + remaining_retention_days: Optional[int] = None, + access_tier_inferred: Optional[bool] = None, + customer_provided_key_sha256: Optional[str] = None, + encryption_scope: Optional[str] = None, + access_tier_change_time: Optional[datetime.datetime] = None, + tag_count: Optional[int] = None, + expires_on: Optional[datetime.datetime] = None, + is_sealed: Optional[bool] = None, + last_accessed_on: Optional[datetime.datetime] = None, + delete_time: Optional[datetime.datetime] = None, + **kwargs + ): + super(BlobPropertiesInternal, self).__init__(**kwargs) + self.creation_time = creation_time + self.last_modified = last_modified + self.etag = etag + self.content_length = content_length + self.content_type = content_type + self.content_encoding = content_encoding + self.content_language = content_language + self.content_md5 = content_md5 + self.content_disposition = content_disposition + self.cache_control = cache_control + self.blob_sequence_number = blob_sequence_number + self.copy_id = copy_id + self.copy_source = copy_source + self.copy_progress = copy_progress + self.copy_completion_time = copy_completion_time + self.copy_status_description = copy_status_description + self.server_encrypted = server_encrypted + self.incremental_copy = incremental_copy + self.destination_snapshot = destination_snapshot + self.deleted_time = deleted_time + self.remaining_retention_days = remaining_retention_days + self.access_tier_inferred = access_tier_inferred + self.customer_provided_key_sha256 = customer_provided_key_sha256 + self.encryption_scope = encryption_scope + self.access_tier_change_time = access_tier_change_time + self.tag_count = tag_count + self.expires_on = expires_on + self.is_sealed = is_sealed + self.last_accessed_on = last_accessed_on + self.delete_time = delete_time + + class FileSystem(msrest.serialization.Model): """FileSystem. @@ -118,6 +419,73 @@ def __init__( self.lease_id = lease_id +class ListBlobsHierarchySegmentResponse(msrest.serialization.Model): + """An enumeration of blobs. + + All required parameters must be populated in order to send to Azure. + + :param service_endpoint: Required. + :type service_endpoint: str + :param container_name: Required. + :type container_name: str + :param prefix: + :type prefix: str + :param marker: + :type marker: str + :param max_results: + :type max_results: int + :param delimiter: + :type delimiter: str + :param segment: Required. + :type segment: ~azure.storage.filedatalake.models.BlobHierarchyListSegment + :param next_marker: + :type next_marker: str + """ + + _validation = { + 'service_endpoint': {'required': True}, + 'container_name': {'required': True}, + 'segment': {'required': True}, + } + + _attribute_map = { + 'service_endpoint': {'key': 'ServiceEndpoint', 'type': 'str', 'xml': {'attr': True}}, + 'container_name': {'key': 'ContainerName', 'type': 'str', 'xml': {'attr': True}}, + 'prefix': {'key': 'Prefix', 'type': 'str'}, + 'marker': {'key': 'Marker', 'type': 'str'}, + 'max_results': {'key': 'MaxResults', 'type': 'int'}, + 'delimiter': {'key': 'Delimiter', 'type': 'str'}, + 'segment': {'key': 'Segment', 'type': 'BlobHierarchyListSegment'}, + 'next_marker': {'key': 'NextMarker', 'type': 'str'}, + } + _xml_map = { + 'name': 'EnumerationResults' + } + + def __init__( + self, + *, + service_endpoint: str, + container_name: str, + segment: "BlobHierarchyListSegment", + prefix: Optional[str] = None, + marker: Optional[str] = None, + max_results: Optional[int] = None, + delimiter: Optional[str] = None, + next_marker: Optional[str] = None, + **kwargs + ): + super(ListBlobsHierarchySegmentResponse, self).__init__(**kwargs) + self.service_endpoint = service_endpoint + self.container_name = container_name + self.prefix = prefix + self.marker = marker + self.max_results = max_results + self.delimiter = delimiter + self.segment = segment + self.next_marker = next_marker + + class ModifiedAccessConditions(msrest.serialization.Model): """Parameter group. @@ -368,24 +736,24 @@ class StorageError(msrest.serialization.Model): """StorageError. :param error: The service error response object. - :type error: ~azure.storage.filedatalake.models.StorageErrorAutoGenerated + :type error: ~azure.storage.filedatalake.models.StorageErrorError """ _attribute_map = { - 'error': {'key': 'error', 'type': 'StorageErrorAutoGenerated'}, + 'error': {'key': 'error', 'type': 'StorageErrorError'}, } def __init__( self, *, - error: Optional["StorageErrorAutoGenerated"] = None, + error: Optional["StorageErrorError"] = None, **kwargs ): super(StorageError, self).__init__(**kwargs) self.error = error -class StorageErrorAutoGenerated(msrest.serialization.Model): +class StorageErrorError(msrest.serialization.Model): """The service error response object. :param code: The service error code. @@ -406,6 +774,6 @@ def __init__( message: Optional[str] = None, **kwargs ): - super(StorageErrorAutoGenerated, self).__init__(**kwargs) + super(StorageErrorError, self).__init__(**kwargs) self.code = code self.message = message diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py index 3726a2dd3cf1..991890ac4e2b 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_file_system_operations.py @@ -18,7 +18,7 @@ if TYPE_CHECKING: # pylint: disable=unused-import,ungrouped-imports - from typing import Any, Callable, Dict, Generic, Iterable, Optional, TypeVar + from typing import Any, Callable, Dict, Generic, Iterable, List, Optional, TypeVar, Union T = TypeVar('T') ClsType = Optional[Callable[[PipelineResponse[HttpRequest, HttpResponse], T, Dict[str, Any]], Any]] @@ -113,7 +113,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -172,7 +172,7 @@ def set_properties( 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError } error_map.update(kwargs.pop('error_map', {})) - + _if_modified_since = None _if_unmodified_since = None if modified_access_conditions is not None: @@ -212,7 +212,7 @@ def set_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -283,7 +283,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -340,7 +340,7 @@ def delete( 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError } error_map.update(kwargs.pop('error_map', {})) - + _if_modified_since = None _if_unmodified_since = None if modified_access_conditions is not None: @@ -378,7 +378,7 @@ def delete( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -452,8 +452,10 @@ def prepare_request(next_link=None, cont_token=None): # Construct headers header_parameters = {} # type: Dict[str, Any] if request_id_parameter is not None: - header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') - header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", + request_id_parameter, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, + 'str') header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') if not next_link: @@ -465,7 +467,8 @@ def prepare_request(next_link=None, cont_token=None): url = self._client.format_url(url, **path_format_arguments) # Construct parameters query_parameters = {} # type: Dict[str, Any] - query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, 'str') + query_parameters['resource'] = self._serialize.query("self._config.resource", self._config.resource, + 'str') if timeout is not None: query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) # TODO: change this once continuation/next_link autorest PR is merged @@ -512,7 +515,7 @@ def get_next(cont_token=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) @@ -521,4 +524,120 @@ def get_next(cont_token=None): return ItemPaged( get_next, extract_data ) + list_paths.metadata = {'url': '/{filesystem}'} # type: ignore + + def list_blob_hierarchy_segment( + self, + prefix=None, # type: Optional[str] + delimiter=None, # type: Optional[str] + marker=None, # type: Optional[str] + max_results=None, # type: Optional[int] + include=None, # type: Optional[List[Union[str, "_models.ListBlobsIncludeItem"]]] + showonly="deleted", # type: Optional[str] + timeout=None, # type: Optional[int] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> "_models.ListBlobsHierarchySegmentResponse" + """The List Blobs operation returns a list of the blobs under the specified container. + + :param prefix: Filters results to filesystems within the specified prefix. + :type prefix: str + :param delimiter: When the request includes this parameter, the operation returns a BlobPrefix + element in the response body that acts as a placeholder for all blobs whose names begin with + the same substring up to the appearance of the delimiter character. The delimiter may be a + single character or a string. + :type delimiter: str + :param marker: A string value that identifies the portion of the list of containers to be + returned with the next listing operation. The operation returns the NextMarker value within the + response body if the listing operation did not return all containers remaining to be listed + with the current page. The NextMarker value can be used as the value for the marker parameter + in a subsequent call to request the next page of list items. The marker value is opaque to the + client. + :type marker: str + :param max_results: An optional value that specifies the maximum number of items to return. If + omitted or greater than 5,000, the response will include up to 5,000 items. + :type max_results: int + :param include: Include this parameter to specify one or more datasets to include in the + response. + :type include: list[str or ~azure.storage.filedatalake.models.ListBlobsIncludeItem] + :param showonly: Include this parameter to specify one or more datasets to include in the + response. + :type showonly: str + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :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. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: ListBlobsHierarchySegmentResponse, or the result of cls(response) + :rtype: ~azure.storage.filedatalake.models.ListBlobsHierarchySegmentResponse + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType["_models.ListBlobsHierarchySegmentResponse"] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + restype = "container" + comp = "list" + accept = "application/xml" + + # Construct URL + url = self.list_blob_hierarchy_segment.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['restype'] = self._serialize.query("restype", restype, 'str') + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if prefix is not None: + query_parameters['prefix'] = self._serialize.query("prefix", prefix, 'str') + if delimiter is not None: + query_parameters['delimiter'] = self._serialize.query("delimiter", delimiter, 'str') + if marker is not None: + query_parameters['marker'] = self._serialize.query("marker", marker, 'str') + if max_results is not None: + query_parameters['maxResults'] = self._serialize.query("max_results", max_results, 'int', minimum=1) + if include is not None: + query_parameters['include'] = self._serialize.query("include", include, '[str]', div=',') + if showonly is not None: + query_parameters['showonly'] = self._serialize.query("showonly", showonly, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.get(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['Content-Type']=self._deserialize('str', response.headers.get('Content-Type')) + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + deserialized = self._deserialize('ListBlobsHierarchySegmentResponse', pipeline_response) + + if cls: + return cls(pipeline_response, deserialized, response_headers) + + return deserialized + list_blob_hierarchy_segment.metadata = {'url': '/{filesystem}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py index bd527947cf31..5517c96888bd 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_path_operations.py @@ -244,7 +244,7 @@ def create( if response.status_code not in [201]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -290,10 +290,10 @@ def update( Uploads data to be appended to a file, flushes (writes) previously uploaded data to a file, sets properties for a file or directory, or sets access control for a file or directory. Data - can only be appended to a file. This operation supports conditional HTTP requests. For more - information, see `Specifying Conditional Headers for Blob Service Operations - `_. + can only be appended to a file. Concurrent writes to the same file using multiple clients are + not supported. This operation supports conditional HTTP requests. For more information, see + `Specifying Conditional Headers for Blob Service Operations `_. :param action: The action must be "append" to upload data to be appended to a file, "flush" to flush previously uploaded data to a file, "setProperties" to set the properties of a file or @@ -505,7 +505,7 @@ def update( if response.status_code not in [200, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -661,7 +661,7 @@ def lease( if response.status_code not in [200, 201, 202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -795,7 +795,7 @@ def read( if response.status_code not in [200, 206]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -956,7 +956,7 @@ def get_properties( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1090,7 +1090,7 @@ def delete( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1098,6 +1098,7 @@ def delete( response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) response_headers['x-ms-continuation']=self._deserialize('str', response.headers.get('x-ms-continuation')) + response_headers['x-ms-deletion-id']=self._deserialize('str', response.headers.get('x-ms-deletion-id')) if cls: return cls(pipeline_response, None, response_headers) @@ -1214,7 +1215,7 @@ def set_access_control( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1325,7 +1326,7 @@ def set_access_control_recursive( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1494,7 +1495,7 @@ def flush_data( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1613,7 +1614,7 @@ def append_data( if response.status_code not in [202]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1695,7 +1696,7 @@ def set_expiry( if response.status_code not in [200]: map_error(status_code=response.status_code, response=response, error_map=error_map) - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) raise HttpResponseError(response=response, model=error) response_headers = {} @@ -1710,3 +1711,79 @@ def set_expiry( return cls(pipeline_response, None, response_headers) set_expiry.metadata = {'url': '/{filesystem}/{path}'} # type: ignore + + def undelete( + self, + timeout=None, # type: Optional[int] + undelete_source=None, # type: Optional[str] + request_id_parameter=None, # type: Optional[str] + **kwargs # type: Any + ): + # type: (...) -> None + """Undelete a path that was previously soft deleted. + + :param timeout: The timeout parameter is expressed in seconds. For more information, see + :code:`Setting Timeouts for Blob Service Operations.`. + :type timeout: int + :param undelete_source: Only for hierarchical namespace enabled accounts. Optional. The path of + the soft deleted blob to undelete. + :type undelete_source: str + :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. + :type request_id_parameter: str + :keyword callable cls: A custom type or function that will be passed the direct response + :return: None, or the result of cls(response) + :rtype: None + :raises: ~azure.core.exceptions.HttpResponseError + """ + cls = kwargs.pop('cls', None) # type: ClsType[None] + error_map = { + 401: ClientAuthenticationError, 404: ResourceNotFoundError, 409: ResourceExistsError + } + error_map.update(kwargs.pop('error_map', {})) + comp = "undelete" + accept = "application/json" + + # Construct URL + url = self.undelete.metadata['url'] # type: ignore + path_format_arguments = { + 'url': self._serialize.url("self._config.url", self._config.url, 'str', skip_quote=True), + } + url = self._client.format_url(url, **path_format_arguments) + + # Construct parameters + query_parameters = {} # type: Dict[str, Any] + query_parameters['comp'] = self._serialize.query("comp", comp, 'str') + if timeout is not None: + query_parameters['timeout'] = self._serialize.query("timeout", timeout, 'int', minimum=0) + + # Construct headers + header_parameters = {} # type: Dict[str, Any] + if undelete_source is not None: + header_parameters['x-ms-undelete-source'] = self._serialize.header("undelete_source", undelete_source, 'str') + header_parameters['x-ms-version'] = self._serialize.header("self._config.version", self._config.version, 'str') + if request_id_parameter is not None: + header_parameters['x-ms-client-request-id'] = self._serialize.header("request_id_parameter", request_id_parameter, 'str') + header_parameters['Accept'] = self._serialize.header("accept", accept, 'str') + + request = self._client.put(url, query_parameters, header_parameters) + pipeline_response = self._client._pipeline.run(request, stream=False, **kwargs) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) + raise HttpResponseError(response=response, model=error) + + response_headers = {} + response_headers['x-ms-client-request-id']=self._deserialize('str', response.headers.get('x-ms-client-request-id')) + response_headers['x-ms-request-id']=self._deserialize('str', response.headers.get('x-ms-request-id')) + response_headers['x-ms-resource-type']=self._deserialize('str', response.headers.get('x-ms-resource-type')) + response_headers['x-ms-version']=self._deserialize('str', response.headers.get('x-ms-version')) + response_headers['Date']=self._deserialize('rfc-1123', response.headers.get('Date')) + + if cls: + return cls(pipeline_response, None, response_headers) + + undelete.metadata = {'url': '/{filesystem}/{path}'} # type: ignore diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py index c5a9555cf0d1..2db3801abff8 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_generated/operations/_service_operations.py @@ -141,7 +141,7 @@ def get_next(next_link=None): response = pipeline_response.http_response if response.status_code not in [200]: - error = self._deserialize(_models.StorageError, response) + error = self._deserialize.failsafe_deserialize(_models.StorageError, response) map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response, model=error) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py new file mode 100644 index 000000000000..543e1e115780 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_list_paths_helper.py @@ -0,0 +1,108 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- + +from azure.core.paging import PageIterator +from azure.core.exceptions import HttpResponseError +from ._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code +from ._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix +from ._shared.models import DictMixin +from ._shared.response_handlers import return_context_and_deserialized + + +class DeletedPathPropertiesPaged(PageIterator): + """An Iterable of deleted path properties. + + :ivar str service_endpoint: The service URL. + :ivar str prefix: A path name prefix being used to filter the list. + :ivar str marker: The continuation token of the current page of results. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str continuation_token: The continuation token to retrieve the next page of results. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar current_page: The current page of listed results. + :vartype current_page: list(~azure.storage.filedatalake.DeletedPathProperties) + :ivar str container: The container that the paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + + :param callable command: Function to retrieve the next page of items. + """ + def __init__( + self, command, + container=None, + prefix=None, + results_per_page=None, + continuation_token=None, + delimiter=None, + location_mode=None): + super(DeletedPathPropertiesPaged, self).__init__( + get_next=self._get_next_cb, + extract_data=self._extract_data_cb, + continuation_token=continuation_token or "" + ) + self._command = command + self.service_endpoint = None + self.prefix = prefix + self.marker = None + self.results_per_page = results_per_page + self.container = container + self.delimiter = delimiter + self.current_page = None + self.location_mode = location_mode + + def _get_next_cb(self, continuation_token): + try: + return self._command( + prefix=self.prefix, + marker=continuation_token or None, + max_results=self.results_per_page, + cls=return_context_and_deserialized, + use_location=self.location_mode) + except HttpResponseError as error: + process_storage_error(error) + + def _extract_data_cb(self, get_next_return): + self.location_mode, self._response = get_next_return + self.service_endpoint = self._response.service_endpoint + self.prefix = self._response.prefix + self.marker = self._response.marker + self.results_per_page = self._response.max_results + self.container = self._response.container_name + self.current_page = self._response.segment.blob_prefixes + self._response.segment.blob_items + self.current_page = [self._build_item(item) for item in self.current_page] + self.delimiter = self._response.delimiter + + return self._response.next_marker or None, self.current_page + + def _build_item(self, item): + if isinstance(item, BlobItemInternal): + file_props = get_deleted_path_properties_from_generated_code(item) + file_props.file_system = self.container + return file_props + if isinstance(item, GenBlobPrefix): + return DirectoryPrefix( + container=self.container, + prefix=item.name, + results_per_page=self.results_per_page, + location_mode=self.location_mode) + return item + + +class DirectoryPrefix(DictMixin): + """Directory prefix. + + :ivar str name: Name of the deleted directory. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar str file_system: The file system that the deleted paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('prefix') + self.results_per_page = kwargs.get('results_per_page') + self.file_system = kwargs.get('container') + self.delimiter = kwargs.get('delimiter') + self.location_mode = kwargs.get('location_mode') diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py index b99f9aa09d78..546fde0b44a8 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_models.py @@ -18,6 +18,8 @@ from azure.storage.blob import DelimitedJsonDialect as BlobDelimitedJSON from azure.storage.blob import ArrowDialect as BlobArrowDialect from azure.storage.blob._models import ContainerPropertiesPaged +from azure.storage.blob._generated.models import Logging as GenLogging, Metrics as GenMetrics, \ + RetentionPolicy as GenRetentionPolicy, StaticWebsite as GenStaticWebsite, CorsRule as GenCorsRule from ._shared.models import DictMixin @@ -827,3 +829,198 @@ def __init__(self, batch_counters, aggregate_counters, batch_failures, continuat self.aggregate_counters = aggregate_counters self.batch_failures = batch_failures self.continuation = continuation + + +class DeletedPathProperties(DictMixin): + """ + Properties populated for a deleted path. + + :ivar str name: + The name of the file in the path. + :ivar ~datetime.datetime deleted_time: + A datetime object representing the time at which the path was deleted. + :ivar int remaining_retention_days: + The number of days that the path will be retained before being permanently deleted by the service. + :ivar str deletion_id: + The id associated with the deleted path. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('name') + self.deleted_time = None + self.remaining_retention_days = None + self.deletion_id = None + + +class AnalyticsLogging(GenLogging): + """Azure Analytics Logging settings. + + :keyword str version: + The version of Storage Analytics to configure. The default value is 1.0. + :keyword bool delete: + Indicates whether all delete requests should be logged. The default value is `False`. + :keyword bool read: + Indicates whether all read requests should be logged. The default value is `False`. + :keyword bool write: + Indicates whether all write requests should be logged. The default value is `False`. + :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy: + Determines how long the associated data should persist. If not specified the retention + policy will be disabled by default. + """ + + def __init__(self, **kwargs): + self.version = kwargs.get('version', u'1.0') + self.delete = kwargs.get('delete', False) + self.read = kwargs.get('read', False) + self.write = kwargs.get('write', False) + self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + version=generated.version, + delete=generated.delete, + read=generated.read, + write=generated.write, + retention_policy=RetentionPolicy._from_generated(generated.retention_policy) # pylint: disable=protected-access + ) + + +class Metrics(GenMetrics): + """A summary of request statistics grouped by API in hour or minute aggregates. + + :keyword str version: + The version of Storage Analytics to configure. The default value is 1.0. + :keyword ~azure.storage.filedatalake.RetentionPolicy retention_policy: + Determines how long the associated data should persist. If not specified the retention + policy will be disabled by default. + """ + + def __init__(self, **kwargs): + self.version = kwargs.get('version', u'1.0') + self.enabled = False + self.include_apis = None + self.retention_policy = kwargs.get('retention_policy') or RetentionPolicy() + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + version=generated.version, + enabled=generated.enabled, + include_apis=generated.include_apis, + retention_policy=RetentionPolicy._from_generated(generated.retention_policy) # pylint: disable=protected-access + ) + + +class RetentionPolicy(GenRetentionPolicy): + """The retention policy which determines how long the associated data should + persist. + + :param bool enabled: + Indicates whether a retention policy is enabled for the storage service. + The default value is False. + :param int days: + Indicates the number of days that metrics or logging or + soft-deleted data should be retained. All data older than this value will + be deleted. If enabled=True, the number of days must be specified. + """ + + def __init__(self, enabled=False, days=None): + super(RetentionPolicy, self).__init__(enabled=enabled, days=days, allow_permanent_delete=None) + if self.enabled and (self.days is None): + raise ValueError("If policy is enabled, 'days' must be specified.") + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + enabled=generated.enabled, + days=generated.days, + ) + + +class StaticWebsite(GenStaticWebsite): + """The properties that enable an account to host a static website. + + :keyword bool enabled: + Indicates whether this account is hosting a static website. + The default value is `False`. + :keyword str index_document: + The default name of the index page under each directory. + :keyword str error_document404_path: + The absolute path of the custom 404 page. + :keyword str default_index_document_path: + Absolute path of the default index page. + """ + + def __init__(self, **kwargs): + self.enabled = kwargs.get('enabled', False) + if self.enabled: + self.index_document = kwargs.get('index_document') + self.error_document404_path = kwargs.get('error_document404_path') + self.default_index_document_path = kwargs.get('default_index_document_path') + else: + self.index_document = None + self.error_document404_path = None + self.default_index_document_path = None + + @classmethod + def _from_generated(cls, generated): + if not generated: + return cls() + return cls( + enabled=generated.enabled, + index_document=generated.index_document, + error_document404_path=generated.error_document404_path, + default_index_document_path=generated.default_index_document_path + ) + + +class CorsRule(GenCorsRule): + """CORS is an HTTP feature that enables a web application running under one + domain to access resources in another domain. Web browsers implement a + security restriction known as same-origin policy that prevents a web page + from calling APIs in a different domain; CORS provides a secure way to + allow one domain (the origin domain) to call APIs in another domain. + + :param list(str) allowed_origins: + A list of origin domains that will be allowed via CORS, or "*" to allow + all domains. The list of must contain at least one entry. Limited to 64 + origin domains. Each allowed origin can have up to 256 characters. + :param list(str) allowed_methods: + A list of HTTP methods that are allowed to be executed by the origin. + The list of must contain at least one entry. For Azure Storage, + permitted methods are DELETE, GET, HEAD, MERGE, POST, OPTIONS or PUT. + :keyword list(str) allowed_headers: + Defaults to an empty list. A list of headers allowed to be part of + the cross-origin request. Limited to 64 defined headers and 2 prefixed + headers. Each header can be up to 256 characters. + :keyword list(str) exposed_headers: + Defaults to an empty list. A list of response headers to expose to CORS + clients. Limited to 64 defined headers and two prefixed headers. Each + header can be up to 256 characters. + :keyword int max_age_in_seconds: + The number of seconds that the client/browser should cache a + preflight response. + """ + + def __init__(self, allowed_origins, allowed_methods, **kwargs): + self.allowed_origins = ','.join(allowed_origins) + self.allowed_methods = ','.join(allowed_methods) + self.allowed_headers = ','.join(kwargs.get('allowed_headers', [])) + self.exposed_headers = ','.join(kwargs.get('exposed_headers', [])) + self.max_age_in_seconds = kwargs.get('max_age_in_seconds', 0) + + @classmethod + def _from_generated(cls, generated): + return cls( + [generated.allowed_origins], + [generated.allowed_methods], + allowed_headers=[generated.allowed_headers], + exposed_headers=[generated.exposed_headers], + max_age_in_seconds=generated.max_age_in_seconds, + ) 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 fcc7c715dfa2..5482fde25067 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 @@ -213,6 +213,7 @@ def _delete_path_options(**kwargs): 'recursive': True, 'lease_access_conditions': access_conditions, 'modified_access_conditions': mod_conditions, + 'cls': return_response_headers, 'timeout': kwargs.pop('timeout', None)} options.update(kwargs) return options diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py index 5df2f5c9a625..be60b3878f66 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_shared/response_handlers.py @@ -80,7 +80,7 @@ def return_headers_and_deserialized(response, deserialized, response_headers): def return_context_and_deserialized(response, deserialized, response_headers): # pylint: disable=unused-argument - return response.location_mode, deserialized + return response.http_response.location_mode, deserialized def process_storage_error(storage_error): 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 c545b0a464e6..f8bbc59eb8da 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 @@ -4,13 +4,14 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method -from typing import Any +from typing import Optional, List, Any from azure.core.paging import ItemPaged from azure.core.pipeline import AsyncPipeline from azure.storage.blob.aio import BlobServiceClient from .._generated.aio import AzureDataLakeStorageRESTAPI +from .._deserialize import get_datalake_service_properties from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin from ._file_system_client_async import FileSystemClient from .._data_lake_service_client import DataLakeServiceClient as DataLakeServiceClientBase @@ -18,7 +19,8 @@ from ._data_lake_directory_client_async import DataLakeDirectoryClient from ._data_lake_file_client_async import DataLakeFileClient from ._models import FileSystemPropertiesPaged -from .._models import UserDelegationKey, LocationMode +from .._models import UserDelegationKey, LocationMode, AnalyticsLogging, Metrics, CorsRule, \ + RetentionPolicy, StaticWebsite class DataLakeServiceClient(AsyncStorageAccountHostsMixin, DataLakeServiceClientBase): @@ -441,3 +443,80 @@ def get_file_client(self, file_system, # type: Union[FileSystemProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function) + + async def set_service_properties( + self, analytics_logging=None, # type: Optional[AnalyticsLogging] + hour_metrics=None, # type: Optional[Metrics] + minute_metrics=None, # type: Optional[Metrics] + cors=None, # type: Optional[List[CorsRule]] + target_version=None, # type: Optional[str] + delete_retention_policy=None, # type: Optional[RetentionPolicy] + static_website=None, # type: Optional[StaticWebsite] + **kwargs + ): + # type: (...) -> None + """Sets the properties of a storage account's Datalake service, including + Azure Storage Analytics. + + If an element (e.g. analytics_logging) is left as None, the + existing settings on the service for that functionality are preserved. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param analytics_logging: + Groups the Azure Analytics Logging settings. + :type analytics_logging: ~azure.storage.filedatalake.AnalyticsLogging + :param hour_metrics: + The hour metrics settings provide a summary of request + statistics grouped by API in hourly aggregates. + :type hour_metrics: ~azure.storage.filedatalake.Metrics + :param minute_metrics: + The minute metrics settings provide request statistics + for each minute. + :type minute_metrics: ~azure.storage.filedatalake.Metrics + :param cors: + You can include up to five CorsRule elements in the + list. If an empty list is specified, all CORS rules will be deleted, + and CORS will be disabled for the service. + :type cors: list[~azure.storage.filedatalake.CorsRule] + :param str target_version: + Indicates the default version to use for requests if an incoming + request's version is not specified. + :param delete_retention_policy: + The delete retention policy specifies whether to retain deleted files/directories. + It also specifies the number of days and versions of file/directory to keep. + :type delete_retention_policy: ~azure.storage.filedatalake.RetentionPolicy + :param static_website: + Specifies whether the static website feature is enabled, + and if yes, indicates the index document and 404 error document to use. + :type static_website: ~azure.storage.filedatalake.StaticWebsite + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: None + """ + return await self._blob_service_client.set_service_properties(analytics_logging=analytics_logging, + hour_metrics=hour_metrics, + minute_metrics=minute_metrics, + cors=cors, + target_version=target_version, + delete_retention_policy=delete_retention_policy, + static_website=static_website, + **kwargs) # pylint: disable=protected-access + + async def get_service_properties(self, **kwargs): + # type: (Any) -> Dict[str, Any] + """Gets the properties of a storage account's datalake service, including + Azure Storage Analytics. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An object containing datalake service properties such as + analytics logging, hour/minute metrics, cors rules, etc. + :rtype: Dict[str, Any] + """ + props = await self._blob_service_client.get_service_properties(**kwargs) # pylint: disable=protected-access + return get_datalake_service_properties(props) 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 108fc1817046..91c954b896f1 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 @@ -5,11 +5,12 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method - +import functools from typing import ( # pylint: disable=unused-import Union, Optional, Any, Dict, TYPE_CHECKING ) +from azure.core.exceptions import HttpResponseError from azure.core.tracing.decorator import distributed_trace from azure.core.pipeline import AsyncPipeline @@ -17,6 +18,8 @@ from azure.core.tracing.decorator_async import distributed_trace_async from azure.storage.blob.aio import ContainerClient +from .._deserialize import process_storage_error, is_file_path +from .._generated.models import ListBlobsIncludeItem from ._data_lake_file_client_async import DataLakeFileClient from ._data_lake_directory_client_async import DataLakeDirectoryClient @@ -26,7 +29,9 @@ from .._generated.aio import AzureDataLakeStorageRESTAPI from .._shared.base_client_async import AsyncTransportWrapper, AsyncStorageAccountHostsMixin from .._shared.policies_async import ExponentialRetry -from .._models import FileSystemProperties, PublicAccess, DirectoryProperties, FileProperties +from .._models import FileSystemProperties, PublicAccess, DirectoryProperties, FileProperties, DeletedPathProperties +from ._list_paths_helper import DeletedPathPropertiesPaged + if TYPE_CHECKING: from datetime import datetime @@ -90,6 +95,9 @@ def __init__( _hosts=self._container_client._hosts,# pylint: disable=protected-access **kwargs) # type: ignore # pylint: disable=protected-access self._client = AzureDataLakeStorageRESTAPI(self.url, file_system=file_system_name, pipeline=self._pipeline) + self._datalake_client_for_blob_operation = AzureDataLakeStorageRESTAPI(self._container_client.url, + file_system=file_system_name, + pipeline=self._pipeline) self._loop = kwargs.get('loop', None) async def __aexit__(self, *args): @@ -701,6 +709,42 @@ async def delete_file(self, file, # type: Union[FileProperties, str] await file_client.delete_file(**kwargs) return file_client + @distributed_trace_async + async def undelete_path(self, deleted_path_name, deletion_id, **kwargs): + # type: (str, str, **Any) -> Union[DataLakeDirectoryClient, DataLakeFileClient] + """Restores soft-deleted path. + + Operation will only be successful if used within the specified number of days + set in the delete retention policy. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str deleted_path_name: + Specifies the name of the deleted container to restore. + :param str deletion_id: + Specifies the version of the deleted container to restore. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :rtype: ~azure.storage.file.datalake.aio.DataLakeDirectoryClient + or azure.storage.file.datalake.aio.DataLakeFileClient + """ + _, url, undelete_source = self._undelete_path(deleted_path_name, deletion_id) + + pipeline = AsyncPipeline( + transport=AsyncTransportWrapper(self._pipeline._transport), # pylint: disable = protected-access + policies=self._pipeline._impl_policies # pylint: disable = protected-access + ) + path_client = AzureDataLakeStorageRESTAPI( + url, filesystem=self.file_system_name, path=deleted_path_name, pipeline=pipeline) + try: + is_file = await path_client.path.undelete(undelete_source=undelete_source, cls=is_file_path, **kwargs) + if is_file: + return self.get_file_client(deleted_path_name) + return self.get_directory_client(deleted_path_name) + except HttpResponseError as error: + process_storage_error(error) + def _get_root_directory_client(self): # type: () -> DataLakeDirectoryClient """Get a client to interact with the root directory. @@ -788,3 +832,37 @@ def get_file_client(self, file_path # type: Union[FileProperties, str] require_encryption=self.require_encryption, key_encryption_key=self.key_encryption_key, key_resolver_function=self.key_resolver_function, loop=self._loop) + + @distributed_trace + def get_deleted_paths(self, + name_starts_with=None, # type: Optional[str], + **kwargs): + # type: (...) -> AsyncItemPaged[DeletedPathProperties] + """Returns a generator to list the paths(could be files or directories) under the specified file system. + The generator will lazily follow the continuation tokens returned by + the service. + + .. versionadded:: 12.4.0 + This operation was introduced in API version '2020-06-12'. + + :param str name_starts_with: + Filters the results to return only paths under the specified path. + :keyword int max_results: + An optional value that specifies the maximum number of items to return per page. + If omitted or greater than 5,000, the response will include up to 5,000 items per page. + :keyword int timeout: + The timeout parameter is expressed in seconds. + :returns: An iterable (auto-paging) response of PathProperties. + :rtype: + ~azure.core.paging.ItemPaged[~azure.storage.filedatalake.DeletedPathProperties] + """ + results_per_page = kwargs.pop('max_results', None) + timeout = kwargs.pop('timeout', None) + command = functools.partial( + self._datalake_client_for_blob_operation.file_system.list_blob_hierarchy_segment, + showonly=ListBlobsIncludeItem.deleted, + timeout=timeout, + **kwargs) + return AsyncItemPaged( + command, prefix=name_starts_with, page_iterator_class=DeletedPathPropertiesPaged, + results_per_page=results_per_page, **kwargs) diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py new file mode 100644 index 000000000000..58b0cf799c83 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_list_paths_helper.py @@ -0,0 +1,111 @@ +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +# pylint: disable=too-few-public-methods, too-many-instance-attributes +# pylint: disable=super-init-not-called, too-many-lines +from azure.core.exceptions import HttpResponseError +from azure.core.async_paging import AsyncPageIterator, AsyncItemPaged + +from .._deserialize import process_storage_error, get_deleted_path_properties_from_generated_code +from .._generated.models import BlobItemInternal, BlobPrefix as GenBlobPrefix + +from .._shared.models import DictMixin +from .._shared.response_handlers import return_context_and_deserialized + + +class DeletedPathPropertiesPaged(AsyncPageIterator): + """An Iterable of deleted path properties. + + :ivar str service_endpoint: The service URL. + :ivar str prefix: A path name prefix being used to filter the list. + :ivar str marker: The continuation token of the current page of results. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str continuation_token: The continuation token to retrieve the next page of results. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar current_page: The current page of listed results. + :vartype current_page: list(~azure.storage.filedatalake.DeletedPathProperties) + :ivar str container: The container that the paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + + :param callable command: Function to retrieve the next page of items. + """ + def __init__( + self, command, + container=None, + prefix=None, + results_per_page=None, + continuation_token=None, + delimiter=None, + location_mode=None): + super(DeletedPathPropertiesPaged, self).__init__( + get_next=self._get_next_cb, + extract_data=self._extract_data_cb, + continuation_token=continuation_token or "" + ) + self._command = command + self.service_endpoint = None + self.prefix = prefix + self.marker = None + self.results_per_page = results_per_page + self.container = container + self.delimiter = delimiter + self.current_page = None + self.location_mode = location_mode + + async def _get_next_cb(self, continuation_token): + try: + return await self._command( + prefix=self.prefix, + marker=continuation_token or None, + max_results=self.results_per_page, + cls=return_context_and_deserialized, + use_location=self.location_mode) + except HttpResponseError as error: + process_storage_error(error) + + async def _extract_data_cb(self, get_next_return): + self.location_mode, self._response = get_next_return + self.service_endpoint = self._response.service_endpoint + self.prefix = self._response.prefix + self.marker = self._response.marker + self.results_per_page = self._response.max_results + self.container = self._response.container_name + self.current_page = self._response.segment.blob_prefixes + self._response.segment.blob_items + self.current_page = [self._build_item(item) for item in self.current_page] + self.delimiter = self._response.delimiter + + return self._response.next_marker or None, self.current_page + + def _build_item(self, item): + if isinstance(item, BlobItemInternal): + file_props = get_deleted_path_properties_from_generated_code(item) + file_props.file_system = self.container + return file_props + if isinstance(item, GenBlobPrefix): + return DirectoryPrefix( + container=self.container, + prefix=item.name, + results_per_page=self.results_per_page, + location_mode=self.location_mode) + return item + + +class DirectoryPrefix(DictMixin): + """Directory prefix. + + :ivar str name: Name of the deleted directory. + :ivar int results_per_page: The maximum number of results retrieved per API call. + :ivar str location_mode: The location mode being used to list results. The available + options include "primary" and "secondary". + :ivar str file_system: The file system that the deleted paths are listed from. + :ivar str delimiter: A delimiting character used for hierarchy listing. + """ + def __init__(self, **kwargs): + self.name = kwargs.get('prefix') + self.results_per_page = kwargs.get('results_per_page') + self.file_system = kwargs.get('container') + self.delimiter = kwargs.get('delimiter') + self.location_mode = kwargs.get('location_mode') diff --git a/sdk/storage/azure-storage-file-datalake/swagger/README.md b/sdk/storage/azure-storage-file-datalake/swagger/README.md index 21473ab91013..47cf1a3b4c8c 100644 --- a/sdk/storage/azure-storage-file-datalake/swagger/README.md +++ b/sdk/storage/azure-storage-file-datalake/swagger/README.md @@ -16,7 +16,7 @@ autorest --v3 --python ### Settings ``` yaml -input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.StorageDataLake/stable/2020-02-10/DataLakeStorage.json +input-file: https://raw.githubusercontent.com/Azure/azure-rest-api-specs/storage-dataplane-preview/specification/storage/data-plane/Microsoft.StorageDataLake/stable/2020-06-12/DataLakeStorage.json output-folder: ../azure/storage/filedatalake/_generated namespace: azure.storage.filedatalake no-namespace-folders: true @@ -25,4 +25,14 @@ enable-xml: true vanilla: true clear-output-folder: true python: true +``` + +### Remove x-ms-pageable +Currently breaking the latest version of autorest.python +``` yaml +directive: +- from: swagger-document + where: $["x-ms-paths"]["/{filesystem}?restype=container&comp=list&hierarchy"].get + transform: > + delete $["x-ms-pageable"]; ``` \ No newline at end of file diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml new file mode 100644 index 000000000000..1fb5e9cd683e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_datalake_service_properties.yaml @@ -0,0 +1,86 @@ +interactions: +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse2014-02-14' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '585' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 729c5ec3-3b15-11eb-9ec2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:28:06 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:28:10 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3dc9118b-001e-0002-7e22-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7427eda6-3b15-11eb-a943-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:28:09 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:28:10 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3dc9119b-001e-0002-0422-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml new file mode 100644 index 000000000000..35d7dfd52efe --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_disabled_static_website_properties.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + false' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '147' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - effd0504-3b15-11eb-8192-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:37 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:39 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5edaeaa9-301e-0019-5322-cffc3a000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f0fef9fb-3b15-11eb-ad49-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:38 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsefalse2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:39 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5edaeab3-301e-0019-5422-cffc3a000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml new file mode 100644 index 000000000000..d08cfd54f5aa --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_cors.yaml @@ -0,0 +1,86 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0efbba3d-3b16-11eb-91ab-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:30 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3dc91467-001e-0002-6622-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0fbe3818-3b16-11eb-98bd-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:30 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:30 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 3dc91470-001e-0002-6722-cfc239000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml new file mode 100644 index 000000000000..e1a232c8d7c0 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_default_service_version.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + 2014-02-14' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '149' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - b4c21f7e-3b15-11eb-b652-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:29:57 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:30:02 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - cb629d48-f01e-0006-0522-cf4f3e000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - b759c331-3b15-11eb-83de-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:02 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:30:02 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - cb629d5c-f01e-0006-0622-cf4f3e000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml new file mode 100644 index 000000000000..03b761e3a8ac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + true2' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bb297712-3b15-11eb-904d-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:08 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:30:12 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 92f6dffa-501e-0020-1722-cf0726000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - bd3db8fc-3b15-11eb-9090-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:30:12 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue2falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:30:12 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 92f6e009-501e-0020-1922-cf0726000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml new file mode 100644 index 000000000000..9ef4605e7ce2 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_delete_retention_policy_edge_cases.yaml @@ -0,0 +1,338 @@ +interactions: +- request: + body: ' + + true1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7bc7f418-90e4-11eb-92b2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:16 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Mon, 29 Mar 2021 23:14:20 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5e3c3b37-b01e-004e-6ff1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7ecf48c9-90e4-11eb-aab6-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:21 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue1falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c835b-b01e-004e-80f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true365' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7eecfdbb-90e4-11eb-8a9c-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 5e3c85fd-b01e-004e-68f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f078f9f-90e4-11eb-8aa7-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c88d8-b01e-004e-63f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true0' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f20830d-90e4-11eb-9a0e-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:5e3c8b63-b01e-004e-38f1-246328000000\nTime:2021-03-29T23:14:22.4739476Z289Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '375' + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 5e3c8b63-b01e-004e-38f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f39264f-90e4-11eb-945f-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c8c4b-b01e-004e-37f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: ' + + true366' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f52df63-90e4-11eb-ba7e-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:5e3c8e3f-b01e-004e-3df1-246328000000\nTime:2021-03-29T23:14:22.7931726Z291Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: + - '375' + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:21 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - InvalidXmlDocument + x-ms-request-id: + - 5e3c8e3f-b01e-004e-3df1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 7f698642-90e4-11eb-8c0a-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:14:22 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: + - application/xml + Date: + - Mon, 29 Mar 2021 23:14:22 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 5e3c9076-b01e-004e-61f1-246328000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml new file mode 100644 index 000000000000..24562d6fab45 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_hour_metrics.yaml @@ -0,0 +1,85 @@ +interactions: +- request: + body: ' + + 1.0falsetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '237' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0365c238-3b16-11eb-80ed-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:09 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:14 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 2b0ba4e1-101e-0021-4922-cf58fa000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 05700bc2-3b16-11eb-bfa8-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:13 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:14 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 2b0ba4ef-101e-0021-4a22-cf58fa000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml new file mode 100644 index 000000000000..4f69cca733c9 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_logging.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - fd342ca3-3b15-11eb-be73-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:59 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:03 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a0d09fae-301e-0009-6622-cf3952000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ff7f0ed3-3b15-11eb-ac57-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:03 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:03 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - a0d09fc6-301e-0009-6b22-cf3952000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml new file mode 100644 index 000000000000..962f4e96e8b4 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_minute_metrics.yaml @@ -0,0 +1,85 @@ +interactions: +- request: + body: ' + + 1.0falsetrue5' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '241' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 09246b04-3b16-11eb-866f-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:19 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:32:23 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 0975cd25-301e-0026-5622-cf3499000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0acacb9d-3b16-11eb-9417-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:32:22 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:32:23 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-request-id: + - 0975cd30-301e-0026-5722-cf3499000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml new file mode 100644 index 000000000000..f8112bd067cc --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_properties.yaml @@ -0,0 +1,83 @@ +interactions: +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - eb84d3a1-3b15-11eb-91d5-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:31 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 19b2c5ec-601e-002b-2a22-cffc4d000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ec154eb8-3b15-11eb-83fe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:30 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:31 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 19b2c5f6-601e-002b-2b22-cffc4d000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml new file mode 100644 index 000000000000..f02927dae495 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client.test_set_static_website_props_dont_impact_other_props.yaml @@ -0,0 +1,165 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f83e45bf-3b15-11eb-a7b4-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:51 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f42-301e-0044-6722-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f8ce4139-3b15-11eb-8843-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:51 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsefalse2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4b-301e-0044-6822-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f8f1cedf-3b15-11eb-800b-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:52 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: + - Thu, 10 Dec 2020 18:31:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4c-301e-0044-6922-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 202 + message: Accepted +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - f919f048-3b15-11eb-a5be-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 18:31:52 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: + - application/xml + Date: + - Thu, 10 Dec 2020 18:31:53 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 618f9f4e-301e-0044-6a22-cff6be000000 + x-ms-version: + - '2020-04-08' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml new file mode 100644 index 000000000000..17b6be66734e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_datalake_service_properties.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: ' + + 1.0falsefalsefalsefalse1.0falsefalse1.0falsefalse2014-02-14' + headers: + Content-Length: + - '585' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2b702a60-3b29-11eb-8248-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:17 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:20 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 4d051f55-601e-0014-6a35-cf34ee000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 2e19cdd4-3b29-11eb-9267-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:21 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:20 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 4d051f62-601e-0014-6c35-cf34ee000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml new file mode 100644 index 000000000000..cdfc6d52c1b2 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_disabled_static_website_properties.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + false' + headers: + Content-Length: + - '147' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c58a66e-3b29-11eb-87d4-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:12 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 035b56a1-801e-0033-0c36-cf232a000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4d32116c-3b29-11eb-9b17-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:13 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsefalse2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 035b56ac-801e-0033-0d36-cf232a000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml new file mode 100644 index 000000000000..5a9e9e5d720e --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_cors.yaml @@ -0,0 +1,66 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 65643618-3b29-11eb-93a7-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:54 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:54 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 0cbd8b49-e01e-0047-6236-cf17da000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 65d59905-3b29-11eb-a3ec-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:55 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:54 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 0cbd8b52-e01e-0047-6336-cf17da000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml new file mode 100644 index 000000000000..34270046cbac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_default_service_version.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + 2014-02-14' + headers: + Content-Length: + - '149' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 39a10d94-3b29-11eb-a3e0-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:41 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:41 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 435b56a2-901e-0000-2c35-cf7c81000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3a0a8d22-3b29-11eb-8570-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:41 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:41 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 435b56ab-901e-0000-2d35-cf7c81000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml new file mode 100644 index 000000000000..bcc584167493 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + true2' + headers: + Content-Length: + - '176' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3de166a3-3b29-11eb-8840-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:48 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:49:48 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2b055e5f-101e-0031-0d35-cf9d92000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 3e4f40cc-3b29-11eb-8857-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:49:49 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue2falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:49:48 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2b055e6f-101e-0031-0e36-cf9d92000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml new file mode 100644 index 000000000000..67249600dbac --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_delete_retention_policy_edge_cases.yaml @@ -0,0 +1,266 @@ +interactions: +- request: + body: ' + + true1' + headers: + Accept: + - application/xml + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cb39e77a-90e4-11eb-be24-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:30 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 74caa7ec-c01e-008f-1bf1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 202 + message: Accepted + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ce837ad8-90e4-11eb-81b2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue1falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb0890-c01e-008f-0bf1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true365' + headers: + Accept: + - application/xml + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ce930b3b-90e4-11eb-9c87-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Mon, 29 Mar 2021 23:16:34 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 74cb0b17-c01e-008f-61f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 202 + message: Accepted + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cea473bc-90e4-11eb-aeda-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb0dd8-c01e-008f-4af1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true0' + headers: + Accept: + - application/xml + Content-Length: + - '176' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ceb5f122-90e4-11eb-947a-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:35 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:74cb106a-c01e-008f-20f1-24c4ca000000\nTime:2021-03-29T23:16:36.0596298Z289Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: '375' + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: InvalidXmlDocument + x-ms-request-id: 74cb106a-c01e-008f-20f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ced91740-90e4-11eb-a356-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb15dd-c01e-008f-6ff1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + true366' + headers: + Accept: + - application/xml + Content-Length: + - '178' + Content-Type: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cee74e3a-90e4-11eb-b89c-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFFInvalidXmlDocumentXML + specified is not syntactically valid.\nRequestId:74cb1805-c01e-008f-0af1-24c4ca000000\nTime:2021-03-29T23:16:36.2485211Z291Retention + days must be greater than 0 and less than or equal to 365 days." + headers: + Content-Length: '375' + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: InvalidXmlDocument + x-ms-request-id: 74cb1805-c01e-008f-0af1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 400 + message: XML specified is not syntactically valid. + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.8.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - cef4e47f-90e4-11eb-8aa2-c8348e5fffbf + x-ms-date: + - Mon, 29 Mar 2021 23:16:36 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0truetruetrue71.0falsefalsetrue365falsefalse" + headers: + Content-Type: application/xml + Date: Mon, 29 Mar 2021 23:16:35 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 74cb1a42-c01e-008f-33f1-24c4ca000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml new file mode 100644 index 000000000000..60af7cbe262d --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_hour_metrics.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: ' + + 1.0falsetrue5' + headers: + Content-Length: + - '237' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5bf31ccc-3b29-11eb-92f1-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:38 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:39 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: db63c688-f01e-0029-6f36-cf42f5000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5c60002b-3b29-11eb-b37d-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:39 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:39 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: db63c692-f01e-0029-7036-cf42f5000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml new file mode 100644 index 000000000000..a314afd7f16a --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_logging.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + 1.0truetruetruetrue5' + headers: + Content-Length: + - '262' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 56586676-3b29-11eb-aad2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:29 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:31 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2f4860f9-b01e-0028-2436-cf1d29000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5859625e-3b29-11eb-bd70-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:32 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:32 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 2f486112-b01e-0028-2a36-cf1d29000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml new file mode 100644 index 000000000000..191dc1a05f7c --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_minute_metrics.yaml @@ -0,0 +1,65 @@ +interactions: +- request: + body: ' + + 1.0falsetrue5' + headers: + Content-Length: + - '241' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5fcc219d-3b29-11eb-af1a-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:45 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:47 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 89f3b107-101e-001e-0a36-cf9059000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 61bdbb7c-3b29-11eb-b710-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:48 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0truetruetruetrue51.0falsetrue51.0falsetrue5GETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:48 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-request-id: 89f3b115-101e-001e-0b36-cf9059000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml new file mode 100644 index 000000000000..f7b9352d25c8 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_properties.yaml @@ -0,0 +1,64 @@ +interactions: +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 46cd3bc1-3b29-11eb-9562-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:03 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 09facd4f-201e-0048-4136-cf61b6000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 48cf4185-3b29-11eb-a7fe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:06 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalsetrue365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 09facd68-201e-0048-4736-cf61b6000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml new file mode 100644 index 000000000000..a13ee293de3f --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_datalake_service_client_async.test_set_static_website_props_dont_impact_other_props.yaml @@ -0,0 +1,127 @@ +interactions: +- request: + body: ' + + www.xyz.comGET0www.xyz.com,www.ab.com,www.bc.comGET,PUTx-ms-meta-data*,x-ms-meta-target*,x-ms-meta-xyz,x-ms-meta-foox-ms-meta-data*,x-ms-meta-source*,x-ms-meta-abc,x-ms-meta-bcd500' + headers: + Content-Length: + - '631' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 507611e3-3b29-11eb-babe-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:19 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7b1-501e-000f-0836-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5294966f-3b29-11eb-83d6-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsefalse2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7ba-501e-000f-0936-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: ' + + trueindex.htmlerrors/error/404error.html' + headers: + Content-Length: + - '258' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 52b6143b-3b29-11eb-9fa2-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: '' + headers: + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7bd-501e-000f-0a36-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 202 + message: Accepted + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-blob/12.6.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 52d33ecf-3b29-11eb-90d7-c8348e5fffbf + x-ms-date: + - Thu, 10 Dec 2020 20:50:23 GMT + x-ms-version: + - '2020-04-08' + method: GET + uri: https://storagename.blob.core.windows.net/?restype=service&comp=properties + response: + body: + string: "\uFEFF1.0falsefalsefalsefalse1.0falsefalse1.0falsefalseGETwww.xyz.com0GET,PUTwww.xyz.com,www.ab.com,www.bc.comx-ms-meta-xyz,x-ms-meta-foo,x-ms-meta-data*,x-ms-meta-target*x-ms-meta-abc,x-ms-meta-bcd,x-ms-meta-data*,x-ms-meta-source*500true365falsetrueindex.htmlerrors/error/404error.html2014-02-14" + headers: + Content-Type: application/xml + Date: Thu, 10 Dec 2020 20:50:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 20bfe7bf-501e-000f-0b36-cf0aed000000 + x-ms-version: '2020-04-08' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/?restype=service&comp=properties +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml new file mode 100644 index 000000000000..4f726f5075ec --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_get_deleted_paths.yaml @@ -0,0 +1,844 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 406ea233-60f2-11eb-8547-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:54 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystem41b81006?restype=container + response: + body: + string: '' + headers: + Date: + - Wed, 27 Jan 2021 22:51:54 GMT + ETag: + - '"0x8D8C316254888AC"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:55 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c1845de-a01e-002b-01ff-f4e900000000 + x-ms-version: + - '2020-04-08' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 40c48a6e-60f2-11eb-bbf2-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:54 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:55 GMT + ETag: + - '"0x8D8C31625ADEA2E"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb57e-901f-001a-36ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41243fe2-60f2-11eb-b74c-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:55 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C31625BFD64A"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb581-901f-001a-37ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4135a62e-60f2-11eb-af30-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:55 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C31625D0A13E"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb582-901f-001a-38ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41469112-60f2-11eb-81f2-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:55 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C31625E1EE35"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb583-901f-001a-39ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4157e33c-60f2-11eb-a23f-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:55 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C31625F30512"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb584-901f-001a-3aff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4168fa4f-60f2-11eb-b786-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C3162604DE38"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb585-901f-001a-3bff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 417aad88-60f2-11eb-854b-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + ETag: + - '"0x8D8C3162618ADE2"' + Last-Modified: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 884fb586-901f-001a-3cff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 418e571a-60f2-11eb-86d8-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file0?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615169967486' + x-ms-request-id: + - 884fb587-901f-001a-3dff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41a6af33-60f2-11eb-866d-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/file1?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:56 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615171454866' + x-ms-request-id: + - 884fb588-901f-001a-3eff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41ba4a9f-60f2-11eb-a71d-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir1?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615172749559' + x-ms-request-id: + - 884fb589-901f-001a-3fff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41cdd2b4-60f2-11eb-aa31-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir2?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615174072130' + x-ms-request-id: + - 884fb58a-901f-001a-40ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41e1f6e4-60f2-11eb-9760-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Ffile_in_dir3?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615175400480' + x-ms-request-id: + - 884fb58b-901f-001a-41ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 41f64313-60f2-11eb-b954-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:56 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystem41b81006/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132562615176756910' + x-ms-request-id: + - 884fb58c-901f-001a-42ff-f4c21d000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 420ab5ee-60f2-11eb-9f48-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:57 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFFdir1132562615172749559trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625D0A13E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir2132562615174072130trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625E1EE350application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir3/file_in_dir3132562615175400480trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3file0132562615169967486trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:56 GMT0x8D8C31625ADEA2E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:56 GMT3file1132562615171454866trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625BFD64A0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3" + headers: + Content-Type: + - application/xml + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c184658-a01e-002b-67ff-f4e900000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4227658e-60f2-11eb-836a-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:57 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?prefix=dir3%2F&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFFdir3/dir3/file_in_dir3132562615175400480trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3" + headers: + Content-Type: + - application/xml + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c184660-a01e-002b-6fff-f4e900000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 423a7878-60f2-11eb-ba86-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:57 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?maxResults=2&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFF2dir1132562615172749559trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625D0A13E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir2132562615174072130trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625E1EE350application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT32!252!MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-" + headers: + Content-Type: + - application/xml + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c184663-a01e-002b-72ff-f4e900000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4259e721-60f2-11eb-93da-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:51:57 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem41b81006?marker=2%21252%21MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-&maxResults=4&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFF2!252!MDAwMTQ0IU9URTJOemszTXpreE1UVTJNelF5TnpZME5pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiVFF4WWpneE1EQTJBVEF4UkRaR05FWkdNREpFTWpORlJqY0NMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MTo1OC4xNDg3Nzg2WiE-4dir3/file_in_dir3132562615175400480trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162604DE380application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3dir3/subdir/file_in_subdir132562615176756910trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C3162618ADE20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3file0132562615169967486trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:56 GMT0x8D8C31625ADEA2E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:56 GMT3file1132562615171454866trueWed, + 27 Jan 2021 22:51:56 GMTWed, 27 Jan 2021 22:51:56 + GMTSun, 31 Jan 2021 22:51:57 GMT0x8D8C31625BFD64A0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:51:57 GMT3" + headers: + Content-Type: + - application/xml + Date: + - Wed, 27 Jan 2021 22:51:57 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-request-id: + - 3c18466a-a01e-002b-78ff-f4e900000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml new file mode 100644 index 000000000000..cde1fb719f4b --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_dir_with_version_id.yaml @@ -0,0 +1,288 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0b4cc4a6-96fb-11eb-96f3-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:53 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs102714b1?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:53 GMT + ETag: + - '"0x8D8F91EEFE08F2A"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 0e483e20-e01e-0098-1107-2b6dc1000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0bbbbba2-96fb-11eb-a4b1-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs102714b1/dir10?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:54 GMT + ETag: + - '"0x8D8F91EF05A3265"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 352a134d-a01f-006d-2407-2bf9eb000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0c2cb5b8-96fb-11eb-8594-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs102714b1/dir10?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132622026556759923' + x-ms-request-id: + - 352a134e-a01f-006d-2507-2bf9eb000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0ca24d8b-96fb-11eb-a718-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10 + response: + body: + string: '' + headers: + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - 0e48407d-e01e-0098-0307-2b6dc1000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0cba7db5-96fb-11eb-a7cf-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:55 GMT + x-ms-undelete-source: + - dir10?deletionid=132622026556759923 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10?comp=undelete + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-request-id: + - 0e4840aa-e01e-0098-2607-2b6dc1000000 + x-ms-resource-type: + - directory + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 0d03eeec-96fb-11eb-aed8-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:10:56 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs102714b1/dir10 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Tue, 06 Apr 2021 17:10:55 GMT + ETag: + - '"0x8D8F91EF05A3265"' + Last-Modified: + - Tue, 06 Apr 2021 17:10:54 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Tue, 06 Apr 2021 17:10:54 GMT + x-ms-group: + - $superuser + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-meta-hdi_isfolder: + - 'true' + x-ms-owner: + - $superuser + x-ms-permissions: + - rwxr-x--- + x-ms-request-id: + - 0e48411c-e01e-0098-0707-2b6dc1000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml new file mode 100644 index 000000000000..012e76897d30 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_undelete_file_with_version_id.yaml @@ -0,0 +1,286 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - c925c631-96fb-11eb-ad8c-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:12 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs1249d1512?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:16:12 GMT + ETag: + - '"0x8D8F91FADB2F1B4"' + Last-Modified: + - Tue, 06 Apr 2021 17:16:12 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7b2cf78f-601e-0062-5508-2b8f87000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - c98985b8-96fb-11eb-9ffe-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:12 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:16:12 GMT + ETag: + - '"0x8D8F91FAE28BFD9"' + Last-Modified: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 036ccca5-d01f-0058-0608-2b95ff000000 + x-ms-request-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - c9fbf927-96fb-11eb-a9fe-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs1249d1512/dir10%2Ffile%C5%87?recursive=true + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: + - 'false' + x-ms-deletion-id: + - '132622029736513453' + x-ms-request-id: + - 036ccca7-d01f-0058-0708-2b95ff000000 + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ca2b7499-96fb-11eb-84c6-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 + response: + body: + string: '' + headers: + Date: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + Vary: + - Origin + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - 7b2cf83d-601e-0062-6408-2b8f87000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ca451c7d-96fb-11eb-98f9-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-undelete-source: + - dir10/file%C5%87?deletionid=132622029736513453 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87?comp=undelete + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-request-id: + - 7b2cf85e-601e-0062-0208-2b8f87000000 + x-ms-resource-type: + - file + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - ca7281ac-96fb-11eb-8757-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:16:14 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs1249d1512/dir10/file%C5%87 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Tue, 06 Apr 2021 17:16:13 GMT + ETag: + - '"0x8D8F91FAE28BFD9"' + Last-Modified: + - Tue, 06 Apr 2021 17:16:13 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: + - Origin + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Tue, 06 Apr 2021 17:16:13 GMT + x-ms-group: + - $superuser + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-owner: + - $superuser + x-ms-permissions: + - rw-r----- + x-ms-request-id: + - 7b2cf8a5-601e-0062-3f08-2b8f87000000 + x-ms-server-encrypted: + - 'true' + x-ms-version: + - '2020-06-12' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml new file mode 100644 index 000000000000..564e1899ad69 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_get_deleted_paths.yaml @@ -0,0 +1,612 @@ +interactions: +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4b555935-60f2-11eb-bc47-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:12 GMT + x-ms-version: + - '2020-04-08' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystemac201283?restype=container + response: + body: + string: '' + headers: + Date: Wed, 27 Jan 2021 22:52:12 GMT + ETag: '"0x8D8C316300AAB7E"' + Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d23c-201e-0004-3bff-f46504000000 + x-ms-version: '2020-04-08' + status: + code: 201 + message: Created + url: https://storagename.blob.core.windows.net/filesystemac201283?restype=container +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4b86e88f-60f2-11eb-8bd8-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:12 GMT + ETag: '"0x8D8C316303C8258"' + Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf7385-a01f-002b-39ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?resource=file +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bb2a2d7-60f2-11eb-98f6-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:12 GMT + ETag: '"0x8D8C3163046B9F2"' + Last-Modified: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf7388-a01f-002b-3aff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?resource=file +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bbcb4e0-60f2-11eb-becd-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C31630504E73"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf7389-a01f-002b-3bff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?resource=directory +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bc637f5-60f2-11eb-b75c-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C3163059D058"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf738a-a01f-002b-3cff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?resource=directory +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bcfac24-60f2-11eb-9c90-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C31630634D0A"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf738b-a01f-002b-3dff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3?resource=directory +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bd921f7-60f2-11eb-8cdf-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C316306D4F4E"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf738c-a01f-002b-3eff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?resource=file +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4be33413-60f2-11eb-8954-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + ETag: '"0x8D8C3163078186E"' + Last-Modified: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 0dcf738d-a01f-002b-3fff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?resource=file +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bedbb55-60f2-11eb-977a-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615343457964' + x-ms-request-id: 0dcf738e-a01f-002b-40ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/file0?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4bfa6593-60f2-11eb-9336-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615344219694' + x-ms-request-id: 0dcf738f-a01f-002b-41ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/file1?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c067444-60f2-11eb-81e5-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615345014937' + x-ms-request-id: 0dcf7390-a01f-002b-42ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir1?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c12339b-60f2-11eb-8927-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:13 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615345790096' + x-ms-request-id: 0dcf7391-a01f-002b-43ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir2?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c1e4147-60f2-11eb-9cea-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615346636843' + x-ms-request-id: 0dcf7392-a01f-002b-44ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Ffile_in_dir3?recursive=true +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c2aeb85-60f2-11eb-80e8-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Wed, 27 Jan 2021 22:52:13 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132562615347463522' + x-ms-request-id: 0dcf7393-a01f-002b-45ff-f4e900000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.dfs.core.windows.net/filesystemac201283/dir3%2Fsubdir%2Ffile_in_subdir?recursive=true +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c3780ef-60f2-11eb-b9b4-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFFdir1132562615345014937trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C31630504E730application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir2132562615345790096trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163059D0580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir3/file_in_dir3132562615346636843trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3file0132562615343457964trueWed, + 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316303C82580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3file1132562615344219694trueWed, + 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163046B9F20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3" + headers: + Content-Type: application/xml + Date: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d24f-201e-0004-4aff-f46504000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?showonly=deleted&restype=container&comp=list +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c4a9e91-60f2-11eb-8d48-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?prefix=dir3/&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFFdir3/dir3/file_in_dir3132562615346636843trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3" + headers: + Content-Type: application/xml + Date: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d250-201e-0004-4bff-f46504000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?prefix=dir3/&showonly=deleted&restype=container&comp=list +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c548bd6-60f2-11eb-9fcd-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?maxResults=2&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFF2dir1132562615345014937trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C31630504E730application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir2132562615345790096trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163059D0580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT32!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-" + headers: + Content-Type: application/xml + Date: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d254-201e-0004-4eff-f46504000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?maxResults=2&showonly=deleted&restype=container&comp=list +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.2.1 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 4c669132-60f2-11eb-88ef-c8348e5fffbf + x-ms-date: + - Wed, 27 Jan 2021 22:52:14 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemac201283?marker=2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-&maxResults=4&showonly=deleted&restype=container&comp=list + response: + body: + string: "\uFEFF2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-4dir3/file_in_dir3132562615346636843trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316306D4F4E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3dir3/subdir/file_in_subdir132562615347463522trueWed, + 27 Jan 2021 22:52:14 GMTWed, 27 Jan 2021 22:52:14 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163078186E0application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3file0132562615343457964trueWed, + 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C316303C82580application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3file1132562615344219694trueWed, + 27 Jan 2021 22:52:13 GMTWed, 27 Jan 2021 22:52:13 + GMTSun, 31 Jan 2021 22:52:14 GMT0x8D8C3163046B9F20application/octet-streamAAAAAAAAAAA=BlockBlobHottruetrueWed, + 27 Jan 2021 22:52:14 GMT3" + headers: + Content-Type: application/xml + Date: Wed, 27 Jan 2021 22:52:14 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-request-id: 8432d255-201e-0004-4fff-f46504000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://storagename.blob.core.windows.net/filesystemac201283?marker=2!252!MDAwMTQ0IU9USXdPVGt4TnpRM016WTJOVGczT1RJeE1pQXdJQzl6WVdOb2FXNXpjMjltZEdSbGJHVjBaVE1CTURGRU5rVkNPVE13TmtFNU1VWTBPQzhrZEhKaGMyZ3ZabWxzWlhONWMzUmxiV0ZqTWpBeE1qZ3pBVEF4UkRaR05FWkdNRVE1TlRVMlFrWUNMMlJwY2pNQyEwMDAwMjghMjAyMS0wMS0yN1QyMjo1MjoxNS4wMDg5NzA5WiE-&maxResults=4&showonly=deleted&restype=container&comp=list +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml new file mode 100644 index 000000000000..63537346b811 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_dir_with_version_id.yaml @@ -0,0 +1,205 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 778aae3a-96fc-11eb-b381-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:04 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs95ee172e?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:04 GMT + ETag: '"0x8D8F9205BF6672C"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 2409aea0-f01e-0002-7309-2bf318000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.blob.core.windows.net/fs95ee172e?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 77d37713-96fc-11eb-bb22-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fs95ee172e/dir10?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:04 GMT + ETag: '"0x8D8F9205C4BA7A1"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: bb03cba3-b01f-0071-0109-2bab8b000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.dfs.core.windows.net/fs95ee172e/dir10?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 781d9f73-96fc-11eb-ad5d-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fs95ee172e/dir10?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132622032658022074' + x-ms-request-id: bb03cba4-b01f-0071-0209-2bab8b000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.dfs.core.windows.net/fs95ee172e/dir10?recursive=true +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 784f84d5-96fc-11eb-95d9-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:05 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10 + response: + body: + string: '' + headers: + Date: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-error-code: BlobNotFound + x-ms-request-id: 2409b039-f01e-0002-5309-2bf318000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 785cf27c-96fc-11eb-a11b-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:06 GMT + x-ms-undelete-source: + - dir10?deletionid=132622032658022074 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10?comp=undelete + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:21:06 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: Tue, 06 Apr 2021 17:21:05 GMT + x-ms-request-id: b6ad0801-d01e-0015-3709-2b5a13000000 + x-ms-resource-type: directory + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10?comp=undelete +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 78b191b7-96fc-11eb-9a2b-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:21:06 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fs95ee172e/dir10 + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Tue, 06 Apr 2021 17:21:06 GMT + ETag: '"0x8D8F9205C4BA7A1"' + Last-Modified: Tue, 06 Apr 2021 17:21:05 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: Origin + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Tue, 06 Apr 2021 17:21:05 GMT + x-ms-group: $superuser + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-meta-hdi_isfolder: 'true' + x-ms-owner: $superuser + x-ms-permissions: rwxr-x--- + x-ms-request-id: b6ad0824-d01e-0015-4f09-2b5a13000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fs95ee172e/dir10 +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml new file mode 100644 index 000000000000..0b0a5d4d345b --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_undelete_file_with_version_id.yaml @@ -0,0 +1,204 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a5e8fe97-96fc-11eb-b4c0-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:22 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fsace1178f?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:22:22 GMT + ETag: '"0x8D8F9208A5A7384"' + Last-Modified: Tue, 06 Apr 2021 17:22:22 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 6ef07b94-001e-004b-3d09-2bb1f3000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.blob.core.windows.net/fsace1178f?restype=container +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a6438765-96fc-11eb-bb73-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:23 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:22:23 GMT + ETag: '"0x8D8F9208ABC9A66"' + Last-Modified: Tue, 06 Apr 2021 17:22:23 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 67afbb3f-101f-0078-2c09-2bee58000000 + x-ms-request-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seannsecanary.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?resource=file +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a6906ac2-96fc-11eb-97b3-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:23 GMT + x-ms-version: + - '2020-06-12' + method: DELETE + uri: https://storagename.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:22:23 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-delete-type-permanent: 'false' + x-ms-deletion-id: '132622033439312883' + x-ms-request-id: 67afbb40-101f-0078-2d09-2bee58000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.dfs.core.windows.net/fsace1178f/dir10%2Ffile%C5%87?recursive=true +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a6e27d5a-96fc-11eb-9984-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:24 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + response: + body: + string: '' + headers: + Date: Tue, 06 Apr 2021 17:22:23 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + Vary: Origin + x-ms-error-code: BlobNotFound + x-ms-request-id: 6ef07bf9-001e-004b-0b09-2bb1f3000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87 +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a6f0e3c0-96fc-11eb-ac2f-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:24 GMT + x-ms-undelete-source: + - dir10/file%C5%87?deletionid=132622033439312883 + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Tue, 06 Apr 2021 17:22:24 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-creation-time: Tue, 06 Apr 2021 17:22:23 GMT + x-ms-request-id: 3c8993bd-d01e-0083-5309-2b53c2000000 + x-ms-resource-type: file + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87?comp=undelete +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - a7641616-96fc-11eb-937b-c8348e5fffbf + x-ms-date: + - Tue, 06 Apr 2021 17:22:24 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/fsace1178f/dir10/file%C5%87 + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Tue, 06 Apr 2021 17:22:24 GMT + ETag: '"0x8D8F9208ABC9A66"' + Last-Modified: Tue, 06 Apr 2021 17:22:23 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Vary: Origin + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Tue, 06 Apr 2021 17:22:23 GMT + x-ms-group: $superuser + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-owner: $superuser + x-ms-permissions: rw-r----- + x-ms-request-id: 3c899409-d01e-0083-1009-2b53c2000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seannsecanary.blob.core.windows.net/fsace1178f/dir10/file%C5%87 +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py new file mode 100644 index 000000000000..349132d475d8 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client.py @@ -0,0 +1,309 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import unittest + +from msrest.exceptions import ValidationError + +from azure.core.exceptions import HttpResponseError + + +from azure.storage.filedatalake import DataLakeServiceClient +from testcase import ( + StorageTestCase, + record, +) + +# ------------------------------------------------------------------------------ +from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \ + StaticWebsite, CorsRule + +# ------------------------------------------------------------------------------ + + +class DatalakeServiceTest(StorageTestCase): + def setUp(self): + super(DatalakeServiceTest, self).setUp() + url = self._get_account_url() + self.dsc = DataLakeServiceClient(url, credential=self.settings.STORAGE_DATA_LAKE_ACCOUNT_KEY, logging_enable=True) + self.config = self.dsc._config + + # --Helpers----------------------------------------------------------------- + def _assert_properties_default(self, prop): + self.assertIsNotNone(prop) + self._assert_logging_equal(prop['analytics_logging'], AnalyticsLogging()) + self._assert_metrics_equal(prop['hour_metrics'], Metrics()) + self._assert_metrics_equal(prop['minute_metrics'], Metrics()) + self._assert_cors_equal(prop['cors'], list()) + + def _assert_logging_equal(self, log1, log2): + if log1 is None or log2 is None: + self.assertEqual(log1, log2) + return + + self.assertEqual(log1.version, log2.version) + self.assertEqual(log1.read, log2.read) + self.assertEqual(log1.write, log2.write) + self.assertEqual(log1.delete, log2.delete) + self._assert_retention_equal(log1.retention_policy, log2.retention_policy) + + def _assert_delete_retention_policy_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertEqual(policy1, policy2) + return + + self.assertEqual(policy1.enabled, policy2.enabled) + self.assertEqual(policy1.days, policy2.days) + + def _assert_static_website_equal(self, prop1, prop2): + if prop1 is None or prop2 is None: + self.assertEqual(prop1, prop2) + return + + self.assertEqual(prop1.enabled, prop2.enabled) + self.assertEqual(prop1.index_document, prop2.index_document) + self.assertEqual(prop1.error_document404_path, prop2.error_document404_path) + self.assertEqual(prop1.default_index_document_path, prop2.default_index_document_path) + + def _assert_delete_retention_policy_not_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertNotEqual(policy1, policy2) + return + + self.assertFalse(policy1.enabled == policy2.enabled + and policy1.days == policy2.days) + + def _assert_metrics_equal(self, metrics1, metrics2): + if metrics1 is None or metrics2 is None: + self.assertEqual(metrics1, metrics2) + return + + self.assertEqual(metrics1.version, metrics2.version) + self.assertEqual(metrics1.enabled, metrics2.enabled) + self.assertEqual(metrics1.include_apis, metrics2.include_apis) + self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy) + + def _assert_cors_equal(self, cors1, cors2): + if cors1 is None or cors2 is None: + self.assertEqual(cors1, cors2) + return + + self.assertEqual(len(cors1), len(cors2)) + + for i in range(0, len(cors1)): + rule1 = cors1[i] + rule2 = cors2[i] + self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins)) + self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods)) + self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds) + self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers)) + self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers)) + + def _assert_retention_equal(self, ret1, ret2): + self.assertEqual(ret1.enabled, ret2.enabled) + self.assertEqual(ret1.days, ret2.days) + + # --Test cases per service --------------------------------------- + @record + def test_datalake_service_properties(self): + # Act + resp = self.dsc.set_service_properties( + analytics_logging=AnalyticsLogging(), + hour_metrics=Metrics(), + minute_metrics=Metrics(), + cors=list(), + target_version='2014-02-14' + ) + + # Assert + self.assertIsNone(resp) + props = self.dsc.get_service_properties() + self._assert_properties_default(props) + self.assertEqual('2014-02-14', props['target_version']) + + @record + def test_empty_set_service_properties_exception(self): + with self.assertRaises(ValueError): + self.dsc.set_service_properties() + + @record + def test_set_default_service_version(self): + # Act + self.dsc.set_service_properties(target_version='2014-02-14') + + # Assert + received_props = self.dsc.get_service_properties() + self.assertEqual(received_props['target_version'], '2014-02-14') + + @record + def test_set_delete_retention_policy(self): + delete_retention_policy = RetentionPolicy(enabled=True, days=2) + + # Act + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @record + def test_set_delete_retention_policy_edge_cases(self): + delete_retention_policy = RetentionPolicy(enabled=True, days=1) + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should work with maximum settings + delete_retention_policy = RetentionPolicy(enabled=True, days=365) + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 0 days + delete_retention_policy = RetentionPolicy(enabled=True, days=0) + + with self.assertRaises(HttpResponseError): + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 366 days + delete_retention_policy = RetentionPolicy(enabled=True, days=366) + + with self.assertRaises(HttpResponseError): + self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @record + def test_set_static_website_properties(self): + static_website = StaticWebsite( + enabled=True, + index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + + @record + def test_disabled_static_website_properties(self): + static_website = StaticWebsite(enabled=False, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False)) + + @record + def test_set_static_website_props_dont_impact_other_props(self): + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act to set cors + self.dsc.set_service_properties(cors=cors) + + # Assert cors is updated + received_props = self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) + + # Arrange to set static website properties + static_website = StaticWebsite(enabled=True, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act to set static website + self.dsc.set_service_properties(static_website=static_website) + + # Assert static website was updated was cors was unchanged + received_props = self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + self._assert_cors_equal(received_props['cors'], cors) + + @record + def test_set_logging(self): + logging = AnalyticsLogging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(analytics_logging=logging) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_logging_equal(received_props['analytics_logging'], logging) + + @record + def test_set_hour_metrics(self): + hour_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(hour_metrics=hour_metrics) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics) + + @record + def test_set_minute_metrics(self): + minute_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + self.dsc.set_service_properties(minute_metrics=minute_metrics) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics) + + @record + def test_set_cors(self): + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act + self.dsc.set_service_properties(cors=cors) + + # Assert + received_props = self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py new file mode 100644 index 000000000000..c0c9163ad17d --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/test_datalake_service_client_async.py @@ -0,0 +1,359 @@ +# coding: utf-8 + +# ------------------------------------------------------------------------- +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. See License.txt in the project root for +# license information. +# -------------------------------------------------------------------------- +import asyncio +import unittest + +from msrest.exceptions import ValidationError + +from azure.core.exceptions import HttpResponseError + + +from azure.storage.filedatalake.aio import DataLakeServiceClient +from testcase import ( + StorageTestCase, + record, +) + +# ------------------------------------------------------------------------------ +from azure.storage.filedatalake._models import AnalyticsLogging, Metrics, RetentionPolicy, \ + StaticWebsite, CorsRule + +# ------------------------------------------------------------------------------ + + +class DatalakeServiceTest(StorageTestCase): + def setUp(self): + super(DatalakeServiceTest, self).setUp() + url = self._get_account_url() + self.dsc = DataLakeServiceClient(url, credential=self.settings.STORAGE_DATA_LAKE_ACCOUNT_KEY, logging_enable=True) + self.config = self.dsc._config + loop = asyncio.get_event_loop() + loop.run_until_complete(self.dsc.__aenter__()) + + # --Helpers----------------------------------------------------------------- + def _assert_properties_default(self, prop): + self.assertIsNotNone(prop) + self._assert_logging_equal(prop['analytics_logging'], AnalyticsLogging()) + self._assert_metrics_equal(prop['hour_metrics'], Metrics()) + self._assert_metrics_equal(prop['minute_metrics'], Metrics()) + self._assert_cors_equal(prop['cors'], list()) + + def _assert_logging_equal(self, log1, log2): + if log1 is None or log2 is None: + self.assertEqual(log1, log2) + return + + self.assertEqual(log1.version, log2.version) + self.assertEqual(log1.read, log2.read) + self.assertEqual(log1.write, log2.write) + self.assertEqual(log1.delete, log2.delete) + self._assert_retention_equal(log1.retention_policy, log2.retention_policy) + + def _assert_delete_retention_policy_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertEqual(policy1, policy2) + return + + self.assertEqual(policy1.enabled, policy2.enabled) + self.assertEqual(policy1.days, policy2.days) + + def _assert_static_website_equal(self, prop1, prop2): + if prop1 is None or prop2 is None: + self.assertEqual(prop1, prop2) + return + + self.assertEqual(prop1.enabled, prop2.enabled) + self.assertEqual(prop1.index_document, prop2.index_document) + self.assertEqual(prop1.error_document404_path, prop2.error_document404_path) + self.assertEqual(prop1.default_index_document_path, prop2.default_index_document_path) + + def _assert_delete_retention_policy_not_equal(self, policy1, policy2): + if policy1 is None or policy2 is None: + self.assertNotEqual(policy1, policy2) + return + + self.assertFalse(policy1.enabled == policy2.enabled + and policy1.days == policy2.days) + + def _assert_metrics_equal(self, metrics1, metrics2): + if metrics1 is None or metrics2 is None: + self.assertEqual(metrics1, metrics2) + return + + self.assertEqual(metrics1.version, metrics2.version) + self.assertEqual(metrics1.enabled, metrics2.enabled) + self.assertEqual(metrics1.include_apis, metrics2.include_apis) + self._assert_retention_equal(metrics1.retention_policy, metrics2.retention_policy) + + def _assert_cors_equal(self, cors1, cors2): + if cors1 is None or cors2 is None: + self.assertEqual(cors1, cors2) + return + + self.assertEqual(len(cors1), len(cors2)) + + for i in range(0, len(cors1)): + rule1 = cors1[i] + rule2 = cors2[i] + self.assertEqual(len(rule1.allowed_origins), len(rule2.allowed_origins)) + self.assertEqual(len(rule1.allowed_methods), len(rule2.allowed_methods)) + self.assertEqual(rule1.max_age_in_seconds, rule2.max_age_in_seconds) + self.assertEqual(len(rule1.exposed_headers), len(rule2.exposed_headers)) + self.assertEqual(len(rule1.allowed_headers), len(rule2.allowed_headers)) + + def _assert_retention_equal(self, ret1, ret2): + self.assertEqual(ret1.enabled, ret2.enabled) + self.assertEqual(ret1.days, ret2.days) + + # --Test cases per service --------------------------------------- + async def _test_datalake_service_properties(self): + # Act + await self.dsc.set_service_properties( + analytics_logging=AnalyticsLogging(), + hour_metrics=Metrics(), + minute_metrics=Metrics(), + cors=list(), + target_version='2014-02-14' + ) + + # Assert + props = await self.dsc.get_service_properties() + self._assert_properties_default(props) + self.assertEqual('2014-02-14', props['target_version']) + + @record + def test_datalake_service_properties(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_datalake_service_properties()) + + async def _test_empty_set_service_properties_exception(self): + with self.assertRaises(ValueError): + await self.dsc.set_service_properties() + + @record + def test_empty_set_service_properties_exception(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_empty_set_service_properties_exception()) + + async def _test_set_default_service_version(self): + # Act + await self.dsc.set_service_properties(target_version='2014-02-14') + + # Assert + received_props = await self.dsc.get_service_properties() + self.assertEqual(received_props['target_version'], '2014-02-14') + + @record + def test_set_default_service_version(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_default_service_version()) + + async def _test_set_delete_retention_policy(self): + delete_retention_policy = RetentionPolicy(enabled=True, days=2) + + # Act + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @record + def test_set_delete_retention_policy(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_delete_retention_policy()) + + async def _test_set_delete_retention_policy_edge_cases(self): + delete_retention_policy = RetentionPolicy(enabled=True, days=1) + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should work with maximum settings + delete_retention_policy = RetentionPolicy(enabled=True, days=365) + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 0 days + delete_retention_policy = RetentionPolicy(enabled=True, days=0) + + with self.assertRaises(HttpResponseError): + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + # Should not work with 366 days + delete_retention_policy = RetentionPolicy(enabled=True, days=366) + + with self.assertRaises(HttpResponseError): + await self.dsc.set_service_properties(delete_retention_policy=delete_retention_policy) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_delete_retention_policy_not_equal(received_props['delete_retention_policy'], delete_retention_policy) + + @record + def test_set_delete_retention_policy_edge_cases(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_delete_retention_policy_edge_cases()) + + async def _test_set_static_website_properties(self): + static_website = StaticWebsite( + enabled=True, + index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + await self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + + @record + def test_set_static_website_properties(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_static_website_properties()) + + async def _test_disabled_static_website_properties(self): + static_website = StaticWebsite(enabled=False, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act + await self.dsc.set_service_properties(static_website=static_website) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], StaticWebsite(enabled=False)) + + @record + def test_disabled_static_website_properties(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_disabled_static_website_properties()) + + async def _test_set_static_website_props_dont_impact_other_props(self): + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act to set cors + await self.dsc.set_service_properties(cors=cors) + + # Assert cors is updated + received_props = await self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) + + # Arrange to set static website properties + static_website = StaticWebsite(enabled=True, index_document="index.html", + error_document404_path="errors/error/404error.html") + + # Act to set static website + await self.dsc.set_service_properties(static_website=static_website) + + # Assert static website was updated was cors was unchanged + received_props = await self.dsc.get_service_properties() + self._assert_static_website_equal(received_props['static_website'], static_website) + self._assert_cors_equal(received_props['cors'], cors) + + @record + def test_set_static_website_props_dont_impact_other_props(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_static_website_props_dont_impact_other_props()) + + async def _test_set_logging(self): + logging = AnalyticsLogging(read=True, write=True, delete=True, retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(analytics_logging=logging) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_logging_equal(received_props['analytics_logging'], logging) + + @record + def test_set_logging(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_logging()) + + async def _test_set_hour_metrics(self): + hour_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(hour_metrics=hour_metrics) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['hour_metrics'], hour_metrics) + + @record + def test_set_hour_metrics(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_hour_metrics()) + + async def _test_set_minute_metrics(self): + minute_metrics = Metrics(retention_policy=RetentionPolicy(enabled=True, days=5)) + + # Act + await self.dsc.set_service_properties(minute_metrics=minute_metrics) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_metrics_equal(received_props['minute_metrics'], minute_metrics) + + @record + def test_set_minute_metrics(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_minute_metrics()) + + async def _test_set_cors(self): + cors_rule1 = CorsRule(['www.xyz.com'], ['GET']) + + allowed_origins = ['www.xyz.com', "www.ab.com", "www.bc.com"] + allowed_methods = ['GET', 'PUT'] + max_age_in_seconds = 500 + exposed_headers = ["x-ms-meta-data*", "x-ms-meta-source*", "x-ms-meta-abc", "x-ms-meta-bcd"] + allowed_headers = ["x-ms-meta-data*", "x-ms-meta-target*", "x-ms-meta-xyz", "x-ms-meta-foo"] + cors_rule2 = CorsRule( + allowed_origins, + allowed_methods, + max_age_in_seconds=max_age_in_seconds, + exposed_headers=exposed_headers, + allowed_headers=allowed_headers) + + cors = [cors_rule1, cors_rule2] + + # Act + await self.dsc.set_service_properties(cors=cors) + + # Assert + received_props = await self.dsc.get_service_properties() + self._assert_cors_equal(received_props['cors'], cors) + + @record + def test_set_cors(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_set_cors()) 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 0c11ff283ae5..cb6af942a250 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py @@ -182,9 +182,7 @@ def test_delete_directory(self): directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name) directory_client.create_directory(metadata=metadata) - response = directory_client.delete_directory() - # Assert - self.assertIsNone(response) + directory_client.delete_directory() @record def test_delete_directory_with_if_modified_since(self): 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 146025b3da37..41eccf3aed16 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 @@ -232,9 +232,7 @@ async def _test_delete_directory(self): directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name) await directory_client.create_directory(metadata=metadata) - response = await directory_client.delete_directory() - # Assert - self.assertIsNone(response) + await directory_client.delete_directory() @record def test_delete_directory_async(self): diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py index 93e79c1c9e97..b7f26dace2ab 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system.py @@ -23,6 +23,8 @@ # ------------------------------------------------------------------------------ from azure.storage.filedatalake import AccessPolicy, FileSystemSasPermissions +from azure.storage.filedatalake._list_paths_helper import DirectoryPrefix +from azure.storage.filedatalake._models import DeletedPathProperties TEST_FILE_SYSTEM_PREFIX = 'filesystem' # ------------------------------------------------------------------------------ @@ -396,6 +398,47 @@ def test_list_paths(self): self.assertEqual(len(paths), 6) self.assertTrue(isinstance(paths[0].last_modified, datetime)) + @record + def test_get_deleted_paths(self): + # Arrange + file_system = self._create_file_system() + file0 = file_system.create_file("file0") + file1 = file_system.create_file("file1") + + dir1 = file_system.create_directory("dir1") + dir2 = file_system.create_directory("dir2") + dir3 = file_system.create_directory("dir3") + file_in_dir3 = dir3.create_file("file_in_dir3") + file_in_subdir = dir3.create_file("subdir/file_in_subdir") + + file0.delete_file() + file1.delete_file() + dir1.delete_directory() + dir2.delete_directory() + file_in_dir3.delete_file() + file_in_subdir.delete_file() + deleted_paths = list(file_system.get_deleted_paths()) + dir3_paths = list(file_system.get_deleted_paths(name_starts_with="dir3/")) + + # Assert + self.assertEqual(len(deleted_paths), 6) + self.assertEqual(len(dir3_paths), 2) + self.assertIsNotNone(dir3_paths[0].deletion_id) + self.assertIsNotNone(dir3_paths[1].deletion_id) + self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3') + self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir') + + paths_generator1 = file_system.get_deleted_paths(max_results=2).by_page() + paths1 = list(next(paths_generator1)) + + paths_generator2 = file_system.get_deleted_paths(max_results=4).by_page( + continuation_token=paths_generator1.continuation_token) + paths2 = list(next(paths_generator2)) + + # Assert + self.assertEqual(len(paths1), 2) + self.assertEqual(len(paths2), 4) + @record def test_list_paths_which_are_all_files(self): # Arrange @@ -530,7 +573,33 @@ def test_file_system_sessions_closes_properly(self): f_client.create_directory() with fs_client.get_directory_client("file2") as f_client: f_client.create_directory() + @record + def test_undelete_dir_with_version_id(self): + if not self.is_playback(): + return + file_system_client = self._create_file_system("fs") + dir_path = 'dir10' + dir_client = file_system_client.create_directory(dir_path) + resp = dir_client.delete_directory() + with self.assertRaises(HttpResponseError): + file_system_client.get_file_client(dir_path).get_file_properties() + restored_dir_client = file_system_client.undelete_path(dir_path, resp['deletion_id']) + resp = restored_dir_client.get_directory_properties() + self.assertIsNotNone(resp) + @record + def test_undelete_file_with_version_id(self): + if not self.is_playback(): + return + file_system_client = self._create_file_system("fs1") + file_path = 'dir10/fileŇ' + dir_client = file_system_client.create_file(file_path) + resp = dir_client.delete_file() + with self.assertRaises(HttpResponseError): + file_system_client.get_file_client(file_path).get_file_properties() + restored_file_client = file_system_client.undelete_path(file_path, resp['deletion_id']) + resp = restored_file_client.get_file_properties() + self.assertIsNotNone(resp) # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main() diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py index 42520ffd64a5..937e05e4c5ab 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_system_async.py @@ -17,8 +17,8 @@ from azure.core.pipeline.transport import AioHttpTransport from multidict import CIMultiDict, CIMultiDictProxy -from azure.storage.filedatalake import AccessPolicy, generate_directory_sas, DirectorySasPermissions, \ - generate_file_system_sas, generate_account_sas, ResourceTypes, AccountSasPermissions +from azure.storage.filedatalake import generate_account_sas, ResourceTypes, AccountSasPermissions +from azure.storage.filedatalake import AccessPolicy, DirectorySasPermissions, generate_file_system_sas from azure.storage.filedatalake.aio import DataLakeServiceClient, DataLakeDirectoryClient, FileSystemClient from azure.storage.filedatalake import PublicAccess from testcase import ( @@ -635,6 +635,59 @@ def test_list_paths_pages_correctly(self): loop = asyncio.get_event_loop() loop.run_until_complete(self._test_list_paths_pages_correctly()) + async def _test_get_deleted_paths(self): + # Arrange + file_system = await self._create_file_system() + file0 = await file_system.create_file("file0") + file1 = await file_system.create_file("file1") + + dir1 = await file_system.create_directory("dir1") + dir2 = await file_system.create_directory("dir2") + dir3 = await file_system.create_directory("dir3") + file_in_dir3 = await dir3.create_file("file_in_dir3") + file_in_subdir = await dir3.create_file("subdir/file_in_subdir") + + await file0.delete_file() + await file1.delete_file() + await dir1.delete_directory() + await dir2.delete_directory() + await file_in_dir3.delete_file() + await file_in_subdir.delete_file() + deleted_paths = [] + async for path in file_system.get_deleted_paths(): + deleted_paths.append(path) + dir3_paths = [] + async for path in file_system.get_deleted_paths(name_starts_with="dir3/"): + dir3_paths.append(path) + + # Assert + self.assertEqual(len(deleted_paths), 6) + self.assertEqual(len(dir3_paths), 2) + self.assertIsNotNone(dir3_paths[0].deletion_id) + self.assertIsNotNone(dir3_paths[1].deletion_id) + self.assertEqual(dir3_paths[0].name, 'dir3/file_in_dir3') + self.assertEqual(dir3_paths[1].name, 'dir3/subdir/file_in_subdir') + + paths_generator1 = file_system.get_deleted_paths(max_results=2).by_page() + paths1 = [] + async for path in await paths_generator1.__anext__(): + paths1.append(path) + + paths_generator2 = file_system.get_deleted_paths(max_results=4) \ + .by_page(continuation_token=paths_generator1.continuation_token) + paths2 = [] + async for path in await paths_generator2.__anext__(): + paths2.append(path) + + # Assert + self.assertEqual(len(paths1), 2) + self.assertEqual(len(paths2), 4) + + @record + def test_get_deleted_paths(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_get_deleted_paths()) + async def _test_create_directory_from_file_system_client_async(self): # Arrange file_system = await self._create_file_system() @@ -776,6 +829,41 @@ def test_file_system_sessions_closes_properly_async(self): loop = asyncio.get_event_loop() loop.run_until_complete(self._test_file_system_sessions_closes_properly_async()) + async def _test_undelete_dir_with_version_id(self): + if not self.is_playback(): + return + file_system_client = await self._create_file_system("fs") + dir_path = 'dir10' + dir_client = await file_system_client.create_directory(dir_path) + resp = await dir_client.delete_directory() + with self.assertRaises(HttpResponseError): + await file_system_client.get_file_client(dir_path).get_file_properties() + restored_dir_client = await file_system_client.undelete_path(dir_path, resp['deletion_id']) + resp = await restored_dir_client.get_directory_properties() + self.assertIsNotNone(resp) + + @record + def test_undelete_dir_with_version_id(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_undelete_dir_with_version_id()) + + async def _test_undelete_file_with_version_id(self): + if not self.is_playback(): + return + file_system_client = await self._create_file_system("fs") + file_path = 'dir10/fileŇ' + dir_client = await file_system_client.create_file(file_path) + resp = await dir_client.delete_file() + with self.assertRaises(HttpResponseError): + await file_system_client.get_file_client(file_path).get_file_properties() + restored_file_client = await file_system_client.undelete_path(file_path, resp['deletion_id']) + resp = await restored_file_client.get_file_properties() + self.assertIsNotNone(resp) + + @record + def test_undelete_file_with_version_id(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_undelete_file_with_version_id()) # ------------------------------------------------------------------------------ if __name__ == '__main__': unittest.main()