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()