diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_directory_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_directory_client.py index b46c43d761b4..22eefba76055 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_directory_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_directory_client.py @@ -3,6 +3,8 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- +from typing import Any + try: from urllib.parse import quote, unquote except ImportError: @@ -241,9 +243,19 @@ def get_directory_properties(self, **kwargs): """ return self._get_path_properties(cls=deserialize_dir_properties, **kwargs) # pylint: disable=protected-access - def rename_directory(self, new_name, # type: str - **kwargs): - # type: (**Any) -> DataLakeDirectoryClient + def exists(self, **kwargs): + # type: (**Any) -> bool + """ + Returns True if a directory exists and returns False otherwise. + + :kwarg int timeout: + The timeout parameter is expressed in seconds. + :returns: boolean + """ + return self._exists(**kwargs) + + def rename_directory(self, new_name, **kwargs): + # type: (str, **Any) -> DataLakeDirectoryClient """ Rename the source directory. diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py index d314712109c0..0a452c189603 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/_data_lake_file_client.py @@ -4,6 +4,7 @@ # license information. # -------------------------------------------------------------------------- from io import BytesIO +from typing import Any try: from urllib.parse import quote, unquote @@ -596,9 +597,19 @@ def download_file(self, offset=None, length=None, **kwargs): downloader = self._blob_client.download_blob(offset=offset, length=length, **kwargs) return StorageStreamDownloader(downloader) - def rename_file(self, new_name, # type: str - **kwargs): - # type: (**Any) -> DataLakeFileClient + def exists(self, **kwargs): + # type: (**Any) -> bool + """ + Returns True if a file exists and returns False otherwise. + + :kwarg int timeout: + The timeout parameter is expressed in seconds. + :returns: boolean + """ + return self._exists(**kwargs) + + def rename_file(self, new_name, **kwargs): + # type: (str, **Any) -> DataLakeFileClient """ Rename the source file. 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 6f5f72ad9a18..0c0fbc36673e 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,7 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- -from typing import Optional +from typing import Optional, Any try: from urllib.parse import urlparse, quote @@ -247,6 +247,17 @@ def create_file_system(self, metadata=None, # type: Optional[Dict[str, str]] public_access=public_access, **kwargs) + def exists(self, **kwargs): + # type: (**Any) -> bool + """ + Returns True if a file system exists and returns False otherwise. + + :kwarg int timeout: + The timeout parameter is expressed in seconds. + :returns: boolean + """ + return self._container_client.exists(**kwargs) + def _rename_file_system(self, new_name, **kwargs): # type: (str, **Any) -> FileSystemClient """Renames a filesystem. 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 ba2425f5c13d..fcc7c715dfa2 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 @@ -3,6 +3,7 @@ # Licensed under the MIT License. See License.txt in the project root for # license information. # -------------------------------------------------------------------------- +from typing import Any, Dict try: from urllib.parse import urlparse, quote @@ -657,9 +658,8 @@ def _rename_path_options(self, rename_source, content_settings=None, metadata=No options.update(kwargs) return options - def _rename_path(self, rename_source, - **kwargs): - # type: (**Any) -> Dict[str, Any] + def _rename_path(self, rename_source, **kwargs): + # type: (str, **Any) -> Dict[str, Any] """ Rename directory or file @@ -764,6 +764,17 @@ def _get_path_properties(self, **kwargs): path_properties = self._blob_client.get_blob_properties(**kwargs) return path_properties + def _exists(self, **kwargs): + # type: (**Any) -> bool + """ + Returns True if a path exists and returns False otherwise. + + :kwarg int timeout: + The timeout parameter is expressed in seconds. + :returns: boolean + """ + return self._blob_client.exists(**kwargs) + def set_metadata(self, metadata, # type: Dict[str, str] **kwargs): # type: (...) -> Dict[str, Union[str, datetime]] diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_directory_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_directory_client_async.py index 23b26feea82c..6fbe94a4c593 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_directory_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_directory_client_async.py @@ -4,6 +4,8 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method +from typing import Any + try: from urllib.parse import quote, unquote except ImportError: @@ -128,6 +130,17 @@ async def create_directory(self, metadata=None, # type: Optional[Dict[str, str] """ return await self._create('directory', metadata=metadata, **kwargs) + async def exists(self, **kwargs): + # type: (**Any) -> bool + """ + Returns True if a directory exists and returns False otherwise. + + :kwarg int timeout: + The timeout parameter is expressed in seconds. + :returns: boolean + """ + return await self._exists(**kwargs) + async def delete_directory(self, **kwargs): # type: (...) -> None """ diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_file_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_file_client_async.py index 9bbc7c267149..34532c94eafd 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_file_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_data_lake_file_client_async.py @@ -4,13 +4,13 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method -from azure.core.exceptions import HttpResponseError - +from typing import Any try: from urllib.parse import quote, unquote except ImportError: from urllib2 import quote, unquote # type: ignore +from azure.core.exceptions import HttpResponseError from ._download_async import StorageStreamDownloader from ._path_client_async import PathClient from .._data_lake_file_client import DataLakeFileClient as DataLakeFileClientBase @@ -130,6 +130,17 @@ async def create_file(self, content_settings=None, # type: Optional[ContentSett """ return await self._create('file', content_settings=content_settings, metadata=metadata, **kwargs) + async def exists(self, **kwargs): + # type: (**Any) -> bool + """ + Returns True if a file exists and returns False otherwise. + + :kwarg int timeout: + The timeout parameter is expressed in seconds. + :returns: boolean + """ + return await self._exists(**kwargs) + async def delete_file(self, **kwargs): # type: (...) -> None """ @@ -461,9 +472,8 @@ async def download_file(self, offset=None, length=None, **kwargs): downloader = await self._blob_client.download_blob(offset=offset, length=length, **kwargs) return StorageStreamDownloader(downloader) - async def rename_file(self, new_name, # type: str - **kwargs): - # type: (**Any) -> DataLakeFileClient + async def rename_file(self, new_name, **kwargs): + # type: (str, **Any) -> DataLakeFileClient """ Rename the source file. 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 1ef4d4791940..108fc1817046 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 @@ -193,6 +193,19 @@ async def create_file_system(self, metadata=None, # type: Optional[Dict[str, st return await self._container_client.create_container(metadata=metadata, public_access=public_access, **kwargs) + + @distributed_trace_async + async def exists(self, **kwargs): + # type: (**Any) -> bool + """ + Returns True if a file system exists and returns False otherwise. + + :kwarg int timeout: + The timeout parameter is expressed in seconds. + :returns: boolean + """ + return await self._container_client.exists(**kwargs) + @distributed_trace_async async def _rename_file_system(self, new_name, **kwargs): # type: (str, **Any) -> FileSystemClient diff --git a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py index 99f1eff10051..43537ec532cc 100644 --- a/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py +++ b/sdk/storage/azure-storage-file-datalake/azure/storage/filedatalake/aio/_path_client_async.py @@ -4,6 +4,8 @@ # license information. # -------------------------------------------------------------------------- # pylint: disable=invalid-overridden-method +from typing import Any, Dict + from azure.core.exceptions import AzureError, HttpResponseError from azure.storage.blob.aio import BlobClient from .._shared.base_client_async import AsyncStorageAccountHostsMixin @@ -489,9 +491,8 @@ async def _set_access_control_internal(self, options, progress_hook, max_batches error.continuation_token = last_continuation_token raise error - async def _rename_path(self, rename_source, - **kwargs): - # type: (**Any) -> Dict[str, Any] + async def _rename_path(self, rename_source, **kwargs): + # type: (str, **Any) -> Dict[str, Any] """ Rename directory or file @@ -585,6 +586,17 @@ async def _get_path_properties(self, **kwargs): path_properties = await self._blob_client.get_blob_properties(**kwargs) return path_properties + async def _exists(self, **kwargs): + # type: (**Any) -> bool + """ + Returns True if a path exists and returns False otherwise. + + :kwarg int timeout: + The timeout parameter is expressed in seconds. + :returns: boolean + """ + return await self._blob_client.exists(**kwargs) + async def set_metadata(self, metadata, # type: Dict[str, str] **kwargs): # type: (...) -> Dict[str, Union[str, datetime]] diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_directory.test_directory_exists.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_directory.test_directory_exists.yaml new file mode 100644 index 000000000000..affe9cc1b5d7 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_directory.test_directory_exists.yaml @@ -0,0 +1,154 @@ +interactions: +- 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.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 9a927806-6d95-11eb-88b1-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:51:27 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-02-10' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem14f20f16/directory14f20f16?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 13 Feb 2021 00:51:27 GMT + ETag: + - '"0x8D8CFB97F049139"' + Last-Modified: + - Sat, 13 Feb 2021 00:51:27 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - fb56c3de-d01f-0087-30a2-015939000000 + x-ms-version: + - '2020-02-10' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 9ad1ad3c-6d95-11eb-83fe-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:51:27 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/filesystem14f20f16/directory14f20f16 + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Sat, 13 Feb 2021 00:51:29 GMT + ETag: + - '"0x8D8CFB97F049139"' + Last-Modified: + - Sat, 13 Feb 2021 00:51:27 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Sat, 13 Feb 2021 00:51:27 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: + - b4f7c70a-a01e-0079-4ea2-013678000000 + x-ms-server-encrypted: + - 'true' + 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.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 9bdb1e09-6d95-11eb-8209-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:51:29 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/filesystem14f20f16/nonexistentdir + response: + body: + string: '' + headers: + Date: + - Sat, 13 Feb 2021 00:51:29 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - b4f7c93c-a01e-0079-7ea2-013678000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_directory_async.test_directory_exists.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_directory_async.test_directory_exists.yaml new file mode 100644 index 000000000000..88894b51a0c0 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_directory_async.test_directory_exists.yaml @@ -0,0 +1,110 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 9c0a3899-6d96-11eb-97ca-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:58:39 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-02-10' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem78031193/directory78031193?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Sat, 13 Feb 2021 00:58:39 GMT + ETag: '"0x8D8CFBA80688D7E"' + Last-Modified: Sat, 13 Feb 2021 00:58:39 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 53966198-b01f-0017-40a3-016357000000 + x-ms-version: '2020-02-10' + status: + code: 201 + message: Created + url: https://seanprodhierarchical.dfs.core.windows.net/filesystem78031193/directory78031193?resource=directory +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 9c380c49-6d96-11eb-8d8e-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:58:39 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/filesystem78031193/directory78031193 + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Sat, 13 Feb 2021 00:58:39 GMT + ETag: '"0x8D8CFBA80688D7E"' + Last-Modified: Sat, 13 Feb 2021 00:58:39 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Sat, 13 Feb 2021 00:58:39 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: 99d7f49a-601e-00df-53a3-018166000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seanprodhierarchical.blob.core.windows.net/filesystem78031193/directory78031193 +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 9c3af273-6d96-11eb-add2-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:58:39 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/filesystem78031193/nonexistentdir + response: + body: + string: '' + headers: + Date: Sat, 13 Feb 2021 00:58:39 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-error-code: BlobNotFound + x-ms-request-id: 99d7f49f-601e-00df-57a3-018166000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://seanprodhierarchical.blob.core.windows.net/filesystem78031193/nonexistentdir +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file.test_file_exists.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file.test_file_exists.yaml new file mode 100644 index 000000000000..eb536fc5d5bf --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file.test_file_exists.yaml @@ -0,0 +1,196 @@ +interactions: +- 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.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 8b3c6806-6d94-11eb-8ce0-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:43:52 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-02-10' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem8ebf0aac/directory8ebf0aac?resource=directory + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 13 Feb 2021 00:43:51 GMT + ETag: + - '"0x8D8CFB86FA2ADD0"' + Last-Modified: + - Sat, 13 Feb 2021 00:43:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a55bcdb1-901f-00db-42a1-010c61000000 + x-ms-version: + - '2020-02-10' + 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.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 8b6e509d-6d94-11eb-a8ab-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:43:52 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-02-10' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystem8ebf0aac/directory8ebf0aac%2Ffilename?resource=file + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 13 Feb 2021 00:43:52 GMT + ETag: + - '"0x8D8CFB86FAF6634"' + Last-Modified: + - Sat, 13 Feb 2021 00:43:52 GMT + Server: + - Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - a55bcdb9-901f-00db-4aa1-010c61000000 + x-ms-version: + - '2020-02-10' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 8b7afa0e-6d94-11eb-b96b-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:43:52 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/filesystem8ebf0aac/directory8ebf0aac/filename + response: + body: + string: '' + headers: + Accept-Ranges: + - bytes + Content-Length: + - '0' + Content-Type: + - application/octet-stream + Date: + - Sat, 13 Feb 2021 00:43:52 GMT + ETag: + - '"0x8D8CFB86FAF6634"' + Last-Modified: + - Sat, 13 Feb 2021 00:43:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: + - Hot + x-ms-access-tier-inferred: + - 'true' + x-ms-blob-type: + - BlockBlob + x-ms-creation-time: + - Sat, 13 Feb 2021 00:43:52 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: + - 430eeb87-701e-008e-3ba1-011cea000000 + x-ms-server-encrypted: + - 'true' + 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.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 8ba2cd58-6d94-11eb-8c8b-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:43:53 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/filesystem8ebf0aac/directory8ebf0aac/nonexistentfile + response: + body: + string: '' + headers: + Date: + - Sat, 13 Feb 2021 00:43:52 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: + - chunked + x-ms-error-code: + - BlobNotFound + x-ms-request-id: + - 430eebc7-701e-008e-73a1-011cea000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_async.test_file_exists.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_async.test_file_exists.yaml new file mode 100644 index 000000000000..7c0c3e8a5c4c --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_async.test_file_exists.yaml @@ -0,0 +1,141 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - efaedac6-6d95-11eb-9bc1-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:53:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-02-10' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemd8210d29/directoryd8210d29?resource=directory + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Sat, 13 Feb 2021 00:53:49 GMT + ETag: '"0x8D8CFB9D41CFDA5"' + Last-Modified: Sat, 13 Feb 2021 00:53:50 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 55a13272-a01f-009d-80a2-0138e6000000 + x-ms-version: '2020-02-10' + status: + code: 201 + message: Created + url: https://seanprodhierarchical.dfs.core.windows.net/filesystemd8210d29/directoryd8210d29?resource=directory +- request: + body: null + headers: + Accept: + - application/json + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - efe889a0-6d95-11eb-bda1-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:53:50 GMT + x-ms-properties: + - '' + x-ms-version: + - '2020-02-10' + method: PUT + uri: https://storagename.dfs.core.windows.net/filesystemd8210d29/directoryd8210d29%2Ffilename?resource=file + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Sat, 13 Feb 2021 00:53:49 GMT + ETag: '"0x8D8CFB9D420F58B"' + Last-Modified: Sat, 13 Feb 2021 00:53:50 GMT + Server: Windows-Azure-HDFS/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: 55a13276-a01f-009d-04a2-0138e6000000 + x-ms-version: '2020-02-10' + status: + code: 201 + message: Created + url: https://seanprodhierarchical.dfs.core.windows.net/filesystemd8210d29/directoryd8210d29%2Ffilename?resource=file +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - efec3311-6d95-11eb-968f-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:53:50 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/filesystemd8210d29/directoryd8210d29/filename + response: + body: + string: '' + headers: + Accept-Ranges: bytes + Content-Length: '0' + Content-Type: application/octet-stream + Date: Sat, 13 Feb 2021 00:53:50 GMT + ETag: '"0x8D8CFB9D420F58B"' + Last-Modified: Sat, 13 Feb 2021 00:53:50 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-access-tier: Hot + x-ms-access-tier-inferred: 'true' + x-ms-blob-type: BlockBlob + x-ms-creation-time: Sat, 13 Feb 2021 00:53:50 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: 266f3dd6-a01e-00a2-34a2-01f045000000 + x-ms-server-encrypted: 'true' + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seanprodhierarchical.blob.core.windows.net/filesystemd8210d29/directoryd8210d29/filename +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - efef6773-6d95-11eb-8bf7-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:53:50 GMT + x-ms-encryption-algorithm: + - AES256 + x-ms-version: + - '2020-06-12' + method: HEAD + uri: https://storagename.blob.core.windows.net/filesystemd8210d29/directoryd8210d29/nonexistentfile + response: + body: + string: '' + headers: + Date: Sat, 13 Feb 2021 00:53:50 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + Transfer-Encoding: chunked + x-ms-error-code: BlobNotFound + x-ms-request-id: 266f3dda-a01e-00a2-38a2-01f045000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified blob does not exist. + url: https://seanprodhierarchical.blob.core.windows.net/filesystemd8210d29/directoryd8210d29/nonexistentfile +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_file_system_exists.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_file_system_exists.yaml new file mode 100644 index 000000000000..d8f54ac30f05 --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system.test_file_system_exists.yaml @@ -0,0 +1,137 @@ +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.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 163422c3-6d95-11eb-853a-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:47:45 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystem545310b4?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 13 Feb 2021 00:47:46 GMT + ETag: + - '"0x8D8CFB8FAA5592A"' + Last-Modified: + - Sat, 13 Feb 2021 00:47:45 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: + - 7b6e01d3-401e-002c-28a1-0126f3000000 + x-ms-version: + - '2020-06-12' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 16db2a0b-6d95-11eb-9edd-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:47:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystem545310b4?restype=container + response: + body: + string: '' + headers: + Content-Length: + - '0' + Date: + - Sat, 13 Feb 2021 00:47:46 GMT + ETag: + - '"0x8D8CFB8FAA5592A"' + Last-Modified: + - Sat, 13 Feb 2021 00:47:45 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-default-encryption-scope: + - $account-encryption-key + x-ms-deny-encryption-scope-override: + - 'false' + x-ms-has-immutability-policy: + - 'false' + x-ms-has-legal-hold: + - 'false' + x-ms-lease-state: + - available + x-ms-lease-status: + - unlocked + x-ms-request-id: + - 7b6e03b5-401e-002c-3da1-0126f3000000 + 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.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 16e52cde-6d95-11eb-9127-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:47:46 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/nonexistentfs?restype=container + response: + body: + string: "\uFEFFContainerNotFoundThe + specified container does not exist.\nRequestId:7b6e03dc-401e-002c-5ea1-0126f3000000\nTime:2021-02-13T00:47:46.7353500Z" + headers: + Content-Length: + - '225' + Content-Type: + - application/xml + Date: + - Sat, 13 Feb 2021 00:47:46 GMT + Server: + - Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: + - ContainerNotFound + x-ms-request-id: + - 7b6e03dc-401e-002c-5ea1-0126f3000000 + x-ms-version: + - '2020-06-12' + status: + code: 404 + message: The specified container does not exist. +version: 1 diff --git a/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_file_system_exists.yaml b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_file_system_exists.yaml new file mode 100644 index 000000000000..e143018691cf --- /dev/null +++ b/sdk/storage/azure-storage-file-datalake/tests/recordings/test_file_system_async.test_file_system_exists.yaml @@ -0,0 +1,99 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5c494251-6d96-11eb-97fd-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:56:52 GMT + x-ms-version: + - '2020-06-12' + method: PUT + uri: https://storagename.blob.core.windows.net/filesystemc1381331?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Sat, 13 Feb 2021 00:56:53 GMT + ETag: '"0x8D8CFBA40A850D8"' + Last-Modified: Sat, 13 Feb 2021 00:56:52 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-request-id: d2c68460-901e-0000-50a3-01ca5c000000 + x-ms-version: '2020-06-12' + status: + code: 201 + message: Created + url: https://seanprodhierarchical.blob.core.windows.net/filesystemc1381331?restype=container +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5d160a32-6d96-11eb-955b-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:56:53 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/filesystemc1381331?restype=container + response: + body: + string: '' + headers: + Content-Length: '0' + Date: Sat, 13 Feb 2021 00:56:53 GMT + ETag: '"0x8D8CFBA40A850D8"' + Last-Modified: Sat, 13 Feb 2021 00:56:52 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-default-encryption-scope: $account-encryption-key + x-ms-deny-encryption-scope-override: 'false' + x-ms-has-immutability-policy: 'false' + x-ms-has-legal-hold: 'false' + x-ms-lease-state: available + x-ms-lease-status: unlocked + x-ms-request-id: d2c686a6-901e-0000-12a3-01ca5c000000 + x-ms-version: '2020-06-12' + status: + code: 200 + message: OK + url: https://seanprodhierarchical.blob.core.windows.net/filesystemc1381331?restype=container +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-dfs/12.3.0b2 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-client-request-id: + - 5d191774-6d96-11eb-a4ac-c8348e5fffbf + x-ms-date: + - Sat, 13 Feb 2021 00:56:53 GMT + x-ms-version: + - '2020-06-12' + method: GET + uri: https://storagename.blob.core.windows.net/nonexistentfs?restype=container + response: + body: + string: "\uFEFFContainerNotFoundThe + specified container does not exist.\nRequestId:d2c686af-901e-0000-18a3-01ca5c000000\nTime:2021-02-13T00:56:53.9582341Z" + headers: + Content-Length: '225' + Content-Type: application/xml + Date: Sat, 13 Feb 2021 00:56:53 GMT + Server: Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 + x-ms-error-code: ContainerNotFound + x-ms-request-id: d2c686af-901e-0000-18a3-01ca5c000000 + x-ms-version: '2020-06-12' + status: + code: 404 + message: The specified container does not exist. + url: https://seanprodhierarchical.blob.core.windows.net/nonexistentfs?restype=container +version: 1 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 221098d61393..0c11ff283ae5 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_directory.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_directory.py @@ -97,6 +97,18 @@ def test_create_directory(self): # Assert self.assertTrue(created) + @record + def test_directory_exists(self): + # Arrange + directory_name = self._get_directory_reference() + + directory_client1 = self.dsc.get_directory_client(self.file_system_name, directory_name) + directory_client2 = self.dsc.get_directory_client(self.file_system_name, "nonexistentdir") + directory_client1.create_directory() + + self.assertTrue(directory_client1.exists()) + self.assertFalse(directory_client2.exists()) + @record def test_using_oauth_token_credential_to_create_directory(self): # generate a token with directory level create permission 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 09074b37ca31..146025b3da37 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 @@ -123,6 +123,22 @@ def test_create_directory_async(self): loop = asyncio.get_event_loop() loop.run_until_complete(self._test_create_directory()) + async def _test_directory_exists(self): + # Arrange + directory_name = self._get_directory_reference() + + directory_client1 = self.dsc.get_directory_client(self.file_system_name, directory_name) + directory_client2 = self.dsc.get_directory_client(self.file_system_name, "nonexistentdir") + await directory_client1.create_directory() + + self.assertTrue(await directory_client1.exists()) + self.assertFalse(await directory_client2.exists()) + + @record + def test_directory_exists(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_directory_exists()) + async def _test_using_oauth_token_credential_to_create_directory(self): # generate a token with directory level create permission directory_name = self._get_directory_reference() diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file.py b/sdk/storage/azure-storage-file-datalake/tests/test_file.py index 80ddebad1f55..6b2d4932df5d 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file.py @@ -101,6 +101,21 @@ def test_create_file(self): # Assert self.assertIsNotNone(response) + @record + def test_file_exists(self): + # Arrange + directory_name = self._get_directory_reference() + + directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name) + directory_client.create_directory() + + file_client1 = directory_client.get_file_client('filename') + file_client2 = directory_client.get_file_client('nonexistentfile') + file_client1.create_file() + + self.assertTrue(file_client1.exists()) + self.assertFalse(file_client2.exists()) + @record def test_create_file_using_oauth_token_credential(self): # Arrange diff --git a/sdk/storage/azure-storage-file-datalake/tests/test_file_async.py b/sdk/storage/azure-storage-file-datalake/tests/test_file_async.py index a0f03141ecf1..3c7a9ee1383e 100644 --- a/sdk/storage/azure-storage-file-datalake/tests/test_file_async.py +++ b/sdk/storage/azure-storage-file-datalake/tests/test_file_async.py @@ -114,6 +114,25 @@ def test_create_file_async(self): loop = asyncio.get_event_loop() loop.run_until_complete(self._test_create_file()) + async def _test_file_exists(self): + # Arrange + directory_name = self._get_directory_reference() + + directory_client = self.dsc.get_directory_client(self.file_system_name, directory_name) + await directory_client.create_directory() + + file_client1 = directory_client.get_file_client('filename') + file_client2 = directory_client.get_file_client('nonexistentfile') + await file_client1.create_file() + + self.assertTrue(await file_client1.exists()) + self.assertFalse(await file_client2.exists()) + + @record + def test_file_exists(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_file_exists()) + async def _test_create_file_using_oauth_token_credential(self): # Arrange file_name = self._get_file_reference() 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 4e03b021079b..93e79c1c9e97 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 @@ -70,6 +70,19 @@ def test_create_file_system(self): # Assert self.assertTrue(created) + @record + def test_file_system_exists(self): + # Arrange + file_system_name = self._get_file_system_reference() + + # Act + file_system_client1 = self.dsc.get_file_system_client(file_system_name) + file_system_client2 = self.dsc.get_file_system_client("nonexistentfs") + file_system_client1.create_file_system() + + self.assertTrue(file_system_client1.exists()) + self.assertFalse(file_system_client2.exists()) + @record def test_create_file_system_with_metadata(self): # Arrange 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 608b9e5984e9..42520ffd64a5 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 @@ -96,6 +96,23 @@ def test_create_file_system_async(self): loop = asyncio.get_event_loop() loop.run_until_complete(self._test_create_file_system_async()) + async def _test_file_system_exists(self): + # Arrange + file_system_name = self._get_file_system_reference() + + # Act + file_system_client1 = self.dsc.get_file_system_client(file_system_name) + file_system_client2 = self.dsc.get_file_system_client("nonexistentfs") + await file_system_client1.create_file_system() + + self.assertTrue(await file_system_client1.exists()) + self.assertFalse(await file_system_client2.exists()) + + @record + def test_file_system_exists(self): + loop = asyncio.get_event_loop() + loop.run_until_complete(self._test_file_system_exists()) + async def _test_create_file_system_with_metadata_async(self): # Arrange metadata = {'hello': 'world', 'number': '42'}