From 380445faf9bbbae9290302ae2dfb6c4b273af16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?McCoy=20Pati=C3=B1o?= <39780829+mccoyp@users.noreply.github.com> Date: Wed, 16 Jun 2021 16:42:46 -0700 Subject: [PATCH] [Key Vault] Custom polling method for admin backup client (#19204) --- .../keyvault/administration/_backup_client.py | 90 ++++- .../administration/_internal/async_polling.py | 12 + .../administration/_internal/polling.py | 22 +- .../administration/aio/_backup_client.py | 75 +++- .../azure-keyvault-administration/setup.py | 2 +- ...p_client.test_full_backup_and_restore.yaml | 84 ++-- ...nt_async.test_full_backup_and_restore.yaml | 90 ++--- ...ation.test_example_backup_and_restore.yaml | 284 +++++++++++++ ...on.test_example_selective_key_restore.yaml | 374 ++++++++++++++++++ ...async.test_example_backup_and_restore.yaml | 186 +++++++++ ...nc.test_example_selective_key_restore.yaml | 251 ++++++++++++ .../tests/test_backup_client.py | 92 ++++- .../tests/test_backup_client_async.py | 108 +++-- .../tests/test_examples_administration.py | 98 +++++ .../test_examples_administration_async.py | 102 +++++ 15 files changed, 1723 insertions(+), 147 deletions(-) create mode 100644 sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_internal/async_polling.py create mode 100644 sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration.test_example_backup_and_restore.yaml create mode 100644 sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration.test_example_selective_key_restore.yaml create mode 100644 sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration_async.test_example_backup_and_restore.yaml create mode 100644 sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration_async.test_example_selective_key_restore.yaml create mode 100644 sdk/keyvault/azure-keyvault-administration/tests/test_examples_administration.py create mode 100644 sdk/keyvault/azure-keyvault-administration/tests/test_examples_administration_async.py diff --git a/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_backup_client.py b/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_backup_client.py index ceaf02fa69f0..f9db72d1cce4 100644 --- a/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_backup_client.py +++ b/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_backup_client.py @@ -2,14 +2,17 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------ +import base64 import functools +import pickle from typing import TYPE_CHECKING -from azure.core.polling.base_polling import LROBasePolling +from six import raise_from +from six.moves.urllib_parse import urlparse from ._models import KeyVaultBackupOperation from ._internal import KeyVaultClientBase, parse_folder_url -from ._internal.polling import KeyVaultBackupClientPolling +from ._internal.polling import KeyVaultBackupClientPolling, KeyVaultBackupClientPollingMethod if TYPE_CHECKING: # pylint:disable=unused-import @@ -17,6 +20,12 @@ from azure.core.polling import LROPoller +def _parse_status_url(url): + parsed = urlparse(url) + job_id = parsed.path.split("/")[2] + return job_id + + class KeyVaultBackupClient(KeyVaultClientBase): """Performs Key Vault backup and restore operations. @@ -37,15 +46,48 @@ def begin_backup(self, blob_storage_url, sas_token, **kwargs): :returns: An :class:`~azure.core.polling.LROPoller` instance. Call `result()` on this object to wait for the operation to complete and get a :class:`KeyVaultBackupOperation`. :rtype: ~azure.core.polling.LROPoller[~azure.keyvault.administration.KeyVaultBackupOperation] + + Example: + .. literalinclude:: ../tests/test_examples_administration.py + :start-after: [START begin_backup] + :end-before: [END begin_backup] + :language: python + :caption: Create a vault backup + :dedent: 8 """ polling_interval = kwargs.pop("_polling_interval", 5) sas_parameter = self._models.SASTokenParameter(storage_resource_uri=blob_storage_url, token=sas_token) + + continuation_token = kwargs.pop("continuation_token", None) + status_response = None + if continuation_token: + status_url = base64.b64decode(continuation_token.encode()).decode("ascii") + try: + job_id = _parse_status_url(status_url) + except Exception as ex: # pylint: disable=broad-except + raise_from( + ValueError( + "The provided continuation_token is malformed. A valid token can be obtained from the " + + "operation poller's continuation_token() method" + ), + ex, + ) + + pipeline_response = self._client.full_backup_status( + vault_base_url=self._vault_url, job_id=job_id, cls=lambda pipeline_response, _, __: pipeline_response + ) + if "azure-asyncoperation" not in pipeline_response.http_response.headers: + pipeline_response.http_response.headers["azure-asyncoperation"] = status_url + status_response = base64.b64encode(pickle.dumps(pipeline_response)).decode("ascii") + return self._client.begin_full_backup( vault_base_url=self._vault_url, azure_storage_blob_container_uri=sas_parameter, cls=KeyVaultBackupOperation._from_generated, - continuation_token=kwargs.pop("continuation_token", None), - polling=LROBasePolling(lro_algorithms=[KeyVaultBackupClientPolling()], timeout=polling_interval, **kwargs), + continuation_token=status_response, + polling=KeyVaultBackupClientPollingMethod( + lro_algorithms=[KeyVaultBackupClientPolling()], timeout=polling_interval, **kwargs + ), **kwargs ) @@ -62,14 +104,50 @@ def begin_restore(self, folder_url, sas_token, **kwargs): :keyword str continuation_token: a continuation token to restart polling from a saved state :keyword str key_name: name of a single key in the backup. When set, only this key will be restored. :rtype: ~azure.core.polling.LROPoller + + Examples: + .. literalinclude:: ../tests/test_examples_administration.py + :start-after: [START begin_restore] + :end-before: [END begin_restore] + :language: python + :caption: Restore a vault backup + :dedent: 8 + + .. literalinclude:: ../tests/test_examples_administration.py + :start-after: [START begin_selective_restore] + :end-before: [END begin_selective_restore] + :language: python + :caption: Restore a single key + :dedent: 8 """ # LROBasePolling passes its kwargs to pipeline.run(), so we remove unexpected args before constructing it continuation_token = kwargs.pop("continuation_token", None) key_name = kwargs.pop("key_name", None) + status_response = None + if continuation_token: + status_url = base64.b64decode(continuation_token.encode()).decode("ascii") + try: + job_id = _parse_status_url(status_url) + except Exception as ex: # pylint: disable=broad-except + raise_from( + ValueError( + "The provided continuation_token is malformed. A valid token can be obtained from the " + + "operation poller's continuation_token() method" + ), + ex, + ) + + pipeline_response = self._client.restore_status( + vault_base_url=self._vault_url, job_id=job_id, cls=lambda pipeline_response, _, __: pipeline_response + ) + if "azure-asyncoperation" not in pipeline_response.http_response.headers: + pipeline_response.http_response.headers["azure-asyncoperation"] = status_url + status_response = base64.b64encode(pickle.dumps(pipeline_response)).decode("ascii") + container_url, folder_name = parse_folder_url(folder_url) sas_parameter = self._models.SASTokenParameter(storage_resource_uri=container_url, token=sas_token) - polling = LROBasePolling( + polling = KeyVaultBackupClientPollingMethod( lro_algorithms=[KeyVaultBackupClientPolling()], timeout=kwargs.pop("_polling_interval", 5), **kwargs ) @@ -88,7 +166,7 @@ def begin_restore(self, folder_url, sas_token, **kwargs): vault_base_url=self._vault_url, restore_blob_details=restore_details, cls=lambda *_: None, # poller.result() returns None - continuation_token=continuation_token, + continuation_token=status_response, polling=polling, **kwargs ) diff --git a/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_internal/async_polling.py b/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_internal/async_polling.py new file mode 100644 index 000000000000..bd77ebd79e4e --- /dev/null +++ b/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_internal/async_polling.py @@ -0,0 +1,12 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import base64 + +from azure.core.polling.async_base_polling import AsyncLROBasePolling + + +class KeyVaultAsyncBackupClientPollingMethod(AsyncLROBasePolling): + def get_continuation_token(self) -> str: + return base64.b64encode(self._operation.get_polling_url().encode()).decode("ascii") diff --git a/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_internal/polling.py b/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_internal/polling.py index b4fe58cead15..1708769f5325 100644 --- a/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_internal/polling.py +++ b/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/_internal/polling.py @@ -2,12 +2,32 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------ -from azure.core.polling.base_polling import OperationResourcePolling +import base64 + +from azure.core.polling.base_polling import LROBasePolling, OperationFailed, OperationResourcePolling class KeyVaultBackupClientPolling(OperationResourcePolling): def __init__(self): + self._polling_url = None super(KeyVaultBackupClientPolling, self).__init__(operation_location_header="azure-asyncoperation") + def get_polling_url(self): + return self._polling_url + def get_final_get_url(self, pipeline_response): return None + + def set_initial_status(self, pipeline_response): + response = pipeline_response.http_response + self._polling_url = response.headers["azure-asyncoperation"] + + if response.status_code in {200, 201, 202, 204}: + return self.get_status(pipeline_response) + raise OperationFailed("Operation failed or canceled") + + +class KeyVaultBackupClientPollingMethod(LROBasePolling): + def get_continuation_token(self): + # type: () -> str + return base64.b64encode(self._operation.get_polling_url().encode()).decode("ascii") diff --git a/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/aio/_backup_client.py b/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/aio/_backup_client.py index 6fb61262ad09..60a0ed91dd16 100644 --- a/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/aio/_backup_client.py +++ b/sdk/keyvault/azure-keyvault-administration/azure/keyvault/administration/aio/_backup_client.py @@ -2,12 +2,14 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------ +import base64 import functools +import pickle from typing import TYPE_CHECKING -from azure.core.polling.async_base_polling import AsyncLROBasePolling - +from .._backup_client import _parse_status_url from .._internal import AsyncKeyVaultClientBase, parse_folder_url +from .._internal.async_polling import KeyVaultAsyncBackupClientPollingMethod from .._internal.polling import KeyVaultBackupClientPolling from .._models import KeyVaultBackupOperation @@ -37,15 +39,43 @@ async def begin_backup( :keyword str continuation_token: a continuation token to restart polling from a saved state :returns: An AsyncLROPoller. Call `result()` on this object to get a :class:`KeyVaultBackupOperation`. :rtype: ~azure.core.polling.AsyncLROPoller[~azure.keyvault.administration.KeyVaultBackupOperation] + + Example: + .. literalinclude:: ../tests/test_examples_administration_async.py + :start-after: [START begin_backup] + :end-before: [END begin_backup] + :language: python + :caption: Create a vault backup + :dedent: 8 """ polling_interval = kwargs.pop("_polling_interval", 5) sas_parameter = self._models.SASTokenParameter(storage_resource_uri=blob_storage_url, token=sas_token) + + continuation_token = kwargs.pop("continuation_token", None) + status_response = None + if continuation_token: + status_url = base64.b64decode(continuation_token.encode()).decode("ascii") + try: + job_id = _parse_status_url(status_url) + except Exception as ex: # pylint: disable=broad-except + raise ValueError( + "The provided continuation_token is malformed. A valid token can be obtained from the operation " + + "poller's continuation_token() method" + ) from ex + + pipeline_response = await self._client.full_backup_status( + vault_base_url=self._vault_url, job_id=job_id, cls=lambda pipeline_response, _, __: pipeline_response + ) + if "azure-asyncoperation" not in pipeline_response.http_response.headers: + pipeline_response.http_response.headers["azure-asyncoperation"] = status_url + status_response = base64.b64encode(pickle.dumps(pipeline_response)).decode("ascii") + return await self._client.begin_full_backup( vault_base_url=self._vault_url, azure_storage_blob_container_uri=sas_parameter, cls=KeyVaultBackupOperation._from_generated, - continuation_token=kwargs.pop("continuation_token", None), - polling=AsyncLROBasePolling( + continuation_token=status_response, + polling=KeyVaultAsyncBackupClientPollingMethod( lro_algorithms=[KeyVaultBackupClientPolling()], timeout=polling_interval, **kwargs ), **kwargs @@ -64,14 +94,47 @@ async def begin_restore(self, folder_url: str, sas_token: str, **kwargs: "Any") :keyword str continuation_token: a continuation token to restart polling from a saved state :keyword str key_name: name of a single key in the backup. When set, only this key will be restored. :rtype: ~azure.core.polling.AsyncLROPoller + + Examples: + .. literalinclude:: ../tests/test_examples_administration_async.py + :start-after: [START begin_restore] + :end-before: [END begin_restore] + :language: python + :caption: Restore a vault backup + :dedent: 8 + + .. literalinclude:: ../tests/test_examples_administration_async.py + :start-after: [START begin_selective_restore] + :end-before: [END begin_selective_restore] + :language: python + :caption: Restore a single key + :dedent: 8 """ # AsyncLROBasePolling passes its kwargs to pipeline.run(), so we remove unexpected args before constructing it continuation_token = kwargs.pop("continuation_token", None) key_name = kwargs.pop("key_name", None) + status_response = None + if continuation_token: + status_url = base64.b64decode(continuation_token.encode()).decode("ascii") + try: + job_id = _parse_status_url(status_url) + except Exception as ex: # pylint: disable=broad-except + raise ValueError( + "The provided continuation_token is malformed. A valid token can be obtained from the operation " + + "poller's continuation_token() method" + ) from ex + + pipeline_response = await self._client.restore_status( + vault_base_url=self._vault_url, job_id=job_id, cls=lambda pipeline_response, _, __: pipeline_response + ) + if "azure-asyncoperation" not in pipeline_response.http_response.headers: + pipeline_response.http_response.headers["azure-asyncoperation"] = status_url + status_response = base64.b64encode(pickle.dumps(pipeline_response)).decode("ascii") + container_url, folder_name = parse_folder_url(folder_url) sas_parameter = self._models.SASTokenParameter(storage_resource_uri=container_url, token=sas_token) - polling = AsyncLROBasePolling( + polling = KeyVaultAsyncBackupClientPollingMethod( lro_algorithms=[KeyVaultBackupClientPolling()], timeout=kwargs.pop("_polling_interval", 5), **kwargs ) @@ -90,7 +153,7 @@ async def begin_restore(self, folder_url: str, sas_token: str, **kwargs: "Any") vault_base_url=self._vault_url, restore_blob_details=restore_details, cls=lambda *_: None, # poller.result() returns None - continuation_token=continuation_token, + continuation_token=status_response, polling=polling, **kwargs ) diff --git a/sdk/keyvault/azure-keyvault-administration/setup.py b/sdk/keyvault/azure-keyvault-administration/setup.py index 307b1ef511fc..d271c634540b 100644 --- a/sdk/keyvault/azure-keyvault-administration/setup.py +++ b/sdk/keyvault/azure-keyvault-administration/setup.py @@ -80,7 +80,7 @@ "azure.keyvault", ] ), - install_requires=["azure-common~=1.1", "azure-core<2.0.0,>=1.11.0", "msrest>=0.6.21"], + install_requires=["azure-common~=1.1", "azure-core<2.0.0,>=1.11.0", "msrest>=0.6.21", "six>=1.11.0"], extras_require={ ":python_version<'3.0'": ["azure-keyvault-nspkg"], ":python_version<'3.4'": ["enum34>=1.0.4"], diff --git a/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_backup_client.test_full_backup_and_restore.yaml b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_backup_client.test_full_backup_and_restore.yaml index c117da91305c..b93e5dff6319 100644 --- a/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_backup_client.test_full_backup_and_restore.yaml +++ b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_backup_client.test_full_backup_and_restore.yaml @@ -13,7 +13,7 @@ interactions: Content-Type: - application/json User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: POST uri: https://managedhsm/backup?api-version=7.2 response: @@ -38,12 +38,12 @@ interactions: x-frame-options: - SAMEORIGIN x-ms-server-latency: - - '2' + - '0' status: code: 401 message: Unauthorized - request: - body: '{"storageResourceUri": "https://storname.blob.core.windows.net/container3twjzazwmh2cwvw", + body: '{"storageResourceUri": "https://storname.blob.core.windows.net/containerebkvpbdw6vhv6bv", "token": "redacted"}' headers: Accept: @@ -53,19 +53,19 @@ interactions: Connection: - keep-alive Content-Length: - - '233' + - '235' Content-Type: - application/json User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: POST uri: https://managedhsm/backup?api-version=7.2 response: body: - string: '{"status":"InProgress","statusDetails":null,"error":null,"startTime":1623262243,"endTime":null,"jobId":"02ceebe3f890458f9dca192b3891edf9","azureStorageBlobContainerUri":null}' + string: '{"status":"InProgress","statusDetails":null,"error":null,"startTime":1623795979,"endTime":null,"jobId":"19a636ea1cd04e73b872fcd250fed223","azureStorageBlobContainerUri":null}' headers: azure-asyncoperation: - - https://managedhsm/backup/02ceebe3f890458f9dca192b3891edf9/pending + - https://managedhsm/backup/19a636ea1cd04e73b872fcd250fed223/pending cache-control: - no-cache content-length: @@ -75,7 +75,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Wed, 09 Jun 2021 18:10:43 GMT + - Tue, 15 Jun 2021 22:26:18 GMT server: - Kestrel strict-transport-security: @@ -85,11 +85,11 @@ interactions: x-frame-options: - SAMEORIGIN x-ms-keyvault-network-info: - - conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; x-ms-keyvault-region: - - centralus + - canadacentral x-ms-server-latency: - - '2430' + - '3112' status: code: 202 message: '' @@ -103,12 +103,12 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: GET - uri: https://managedhsm/backup/02ceebe3f890458f9dca192b3891edf9/pending + uri: https://managedhsm/backup/19a636ea1cd04e73b872fcd250fed223/pending response: body: - string: '{"azureStorageBlobContainerUri":"https://storname.blob.core.windows.net/container3twjzazwmh2cwvw/mhsm-mcpatinotesthsm-2021060918104369","endTime":1623262252,"error":null,"jobId":"02ceebe3f890458f9dca192b3891edf9","startTime":1623262243,"status":"Succeeded","statusDetails":null}' + string: '{"azureStorageBlobContainerUri":"https://storname.blob.core.windows.net/containerebkvpbdw6vhv6bv/mhsm-mcpatinotesthsm-2021061522261918","endTime":1623795989,"error":null,"jobId":"19a636ea1cd04e73b872fcd250fed223","startTime":1623795979,"status":"Succeeded","statusDetails":null}' headers: cache-control: - no-cache @@ -119,7 +119,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Wed, 09 Jun 2021 18:10:57 GMT + - Tue, 15 Jun 2021 22:26:31 GMT server: - Kestrel strict-transport-security: @@ -131,17 +131,17 @@ interactions: x-ms-build-version: - 1.0.20210520-1-d6634624-develop x-ms-keyvault-network-info: - - conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; x-ms-keyvault-region: - - centralus + - canadacentral x-ms-server-latency: - - '4139' + - '2436' status: code: 200 message: OK - request: - body: '{"sasTokenParameters": {"storageResourceUri": "https://storname.blob.core.windows.net/container3twjzazwmh2cwvw", - "token": "redacted"}, "folderToRestore": "mhsm-mcpatinotesthsm-2021060918104369"}' + body: '{"sasTokenParameters": {"storageResourceUri": "https://storname.blob.core.windows.net/containerebkvpbdw6vhv6bv", + "token": "redacted"}, "folderToRestore": "mhsm-mcpatinotesthsm-2021061522261918"}' headers: Accept: - application/json @@ -150,19 +150,19 @@ interactions: Connection: - keep-alive Content-Length: - - '317' + - '319' Content-Type: - application/json User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: PUT uri: https://managedhsm/restore?api-version=7.2 response: body: - string: '{"endTime":null,"error":null,"jobId":"135e9be3e38c43f69e1d4f8b25262b52","startTime":1623262260,"status":"InProgress","statusDetails":null}' + string: '{"endTime":null,"error":null,"jobId":"a66229e63f5b4dc8864e224990a03f39","startTime":1623795994,"status":"InProgress","statusDetails":null}' headers: azure-asyncoperation: - - https://managedhsm/restore/135e9be3e38c43f69e1d4f8b25262b52/pending + - https://managedhsm/restore/a66229e63f5b4dc8864e224990a03f39/pending cache-control: - no-cache content-length: @@ -172,7 +172,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Wed, 09 Jun 2021 18:11:00 GMT + - Tue, 15 Jun 2021 22:26:34 GMT server: - Kestrel strict-transport-security: @@ -182,11 +182,11 @@ interactions: x-frame-options: - SAMEORIGIN x-ms-keyvault-network-info: - - conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; x-ms-keyvault-region: - - centralus + - canadacentral x-ms-server-latency: - - '2245' + - '2762' status: code: 202 message: '' @@ -200,12 +200,12 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: GET - uri: https://managedhsm/restore/135e9be3e38c43f69e1d4f8b25262b52/pending + uri: https://managedhsm/restore/a66229e63f5b4dc8864e224990a03f39/pending response: body: - string: '{"endTime":null,"error":null,"jobId":"135e9be3e38c43f69e1d4f8b25262b52","startTime":1623262260,"status":"InProgress","statusDetails":null}' + string: '{"endTime":null,"error":null,"jobId":"a66229e63f5b4dc8864e224990a03f39","startTime":1623795994,"status":"InProgress","statusDetails":null}' headers: cache-control: - no-cache @@ -216,7 +216,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Wed, 09 Jun 2021 18:11:12 GMT + - Tue, 15 Jun 2021 22:26:46 GMT server: - Kestrel strict-transport-security: @@ -228,11 +228,11 @@ interactions: x-ms-build-version: - 1.0.20210520-1-d6634624-develop x-ms-keyvault-network-info: - - conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; x-ms-keyvault-region: - - centralus + - canadacentral x-ms-server-latency: - - '2398' + - '2334' status: code: 200 message: OK @@ -246,12 +246,12 @@ interactions: Connection: - keep-alive User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: GET - uri: https://managedhsm/restore/135e9be3e38c43f69e1d4f8b25262b52/pending + uri: https://managedhsm/restore/a66229e63f5b4dc8864e224990a03f39/pending response: body: - string: '{"endTime":1623262276,"error":null,"jobId":"135e9be3e38c43f69e1d4f8b25262b52","startTime":1623262260,"status":"Succeeded","statusDetails":null}' + string: '{"endTime":1623796011,"error":null,"jobId":"a66229e63f5b4dc8864e224990a03f39","startTime":1623795994,"status":"Succeeded","statusDetails":null}' headers: cache-control: - no-cache @@ -262,7 +262,7 @@ interactions: content-type: - application/json; charset=utf-8 date: - - Wed, 09 Jun 2021 18:11:19 GMT + - Tue, 15 Jun 2021 22:26:54 GMT server: - Kestrel strict-transport-security: @@ -274,11 +274,11 @@ interactions: x-ms-build-version: - 1.0.20210520-1-d6634624-develop x-ms-keyvault-network-info: - - conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; x-ms-keyvault-region: - - centralus + - canadacentral x-ms-server-latency: - - '2170' + - '2689' status: code: 200 message: OK diff --git a/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_backup_client_async.test_full_backup_and_restore.yaml b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_backup_client_async.test_full_backup_and_restore.yaml index 7f5361a2d939..6dcf5ba873e7 100644 --- a/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_backup_client_async.test_full_backup_and_restore.yaml +++ b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_backup_client_async.test_full_backup_and_restore.yaml @@ -9,7 +9,7 @@ interactions: Content-Type: - application/json User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: POST uri: https://managedhsm/backup?api-version=7.2 response: @@ -25,42 +25,42 @@ interactions: resource="https://managedhsm.azure.net" x-content-type-options: nosniff x-frame-options: SAMEORIGIN - x-ms-server-latency: '0' + x-ms-server-latency: '1' status: code: 401 message: Unauthorized url: https://mcpatinotesthsm.managedhsm.azure.net/backup?api-version=7.2 - request: - body: '{"storageResourceUri": "https://storname.blob.core.windows.net/container37sfaze3bkss4j3", + body: '{"storageResourceUri": "https://storname.blob.core.windows.net/containerwt3qjyb4eluro3w", "token": "redacted"}' headers: Accept: - application/json Content-Length: - - '235' + - '233' Content-Type: - application/json User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: POST uri: https://managedhsm/backup?api-version=7.2 response: body: - string: '{"status":"InProgress","statusDetails":null,"error":null,"startTime":1623262396,"endTime":null,"jobId":"e1a391e096fd4462a2a79d536e17afd8","azureStorageBlobContainerUri":null}' + string: '{"status":"InProgress","statusDetails":null,"error":null,"startTime":1623796131,"endTime":null,"jobId":"47fa9b06eeca494d901a9768bc4ecb15","azureStorageBlobContainerUri":null}' headers: - azure-asyncoperation: https://managedhsm/backup/e1a391e096fd4462a2a79d536e17afd8/pending + azure-asyncoperation: https://managedhsm/backup/47fa9b06eeca494d901a9768bc4ecb15/pending cache-control: no-cache content-length: '174' content-security-policy: default-src 'self' content-type: application/json; charset=utf-8 - date: Wed, 09 Jun 2021 18:13:15 GMT + date: Tue, 15 Jun 2021 22:28:50 GMT server: Kestrel strict-transport-security: max-age=31536000; includeSubDomains x-content-type-options: nosniff x-frame-options: SAMEORIGIN - x-ms-keyvault-network-info: conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; - x-ms-keyvault-region: centralus - x-ms-server-latency: '2128' + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2503' status: code: 202 message: '' @@ -69,61 +69,61 @@ interactions: body: null headers: User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: GET - uri: https://managedhsm/backup/e1a391e096fd4462a2a79d536e17afd8/pending + uri: https://managedhsm/backup/47fa9b06eeca494d901a9768bc4ecb15/pending response: body: - string: '{"azureStorageBlobContainerUri":"https://storname.blob.core.windows.net/container37sfaze3bkss4j3/mhsm-mcpatinotesthsm-2021060918131647","endTime":1623262405,"error":null,"jobId":"e1a391e096fd4462a2a79d536e17afd8","startTime":1623262396,"status":"Succeeded","statusDetails":null}' + string: '{"azureStorageBlobContainerUri":"https://storname.blob.core.windows.net/containerwt3qjyb4eluro3w/mhsm-mcpatinotesthsm-2021061522285112","endTime":1623796140,"error":null,"jobId":"47fa9b06eeca494d901a9768bc4ecb15","startTime":1623796131,"status":"Succeeded","statusDetails":null}' headers: cache-control: no-cache content-length: '294' content-security-policy: default-src 'self' content-type: application/json; charset=utf-8 - date: Wed, 09 Jun 2021 18:13:28 GMT + date: Tue, 15 Jun 2021 22:29:03 GMT server: Kestrel strict-transport-security: max-age=31536000; includeSubDomains x-content-type-options: nosniff x-frame-options: SAMEORIGIN x-ms-build-version: 1.0.20210520-1-d6634624-develop - x-ms-keyvault-network-info: conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; - x-ms-keyvault-region: centralus - x-ms-server-latency: '1971' + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2158' status: code: 200 message: OK - url: https://mcpatinotesthsm.managedhsm.azure.net/backup/e1a391e096fd4462a2a79d536e17afd8/pending + url: https://mcpatinotesthsm.managedhsm.azure.net/backup/47fa9b06eeca494d901a9768bc4ecb15/pending - request: - body: '{"sasTokenParameters": {"storageResourceUri": "https://storname.blob.core.windows.net/container37sfaze3bkss4j3", - "token": "redacted"}, "folderToRestore": "mhsm-mcpatinotesthsm-2021060918131647"}' + body: '{"sasTokenParameters": {"storageResourceUri": "https://storname.blob.core.windows.net/containerwt3qjyb4eluro3w", + "token": "redacted"}, "folderToRestore": "mhsm-mcpatinotesthsm-2021061522285112"}' headers: Accept: - application/json Content-Length: - - '319' + - '317' Content-Type: - application/json User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: PUT uri: https://managedhsm/restore?api-version=7.2 response: body: - string: '{"endTime":null,"error":null,"jobId":"4fcf1426713543abb14fd9360dd40754","startTime":1623262410,"status":"InProgress","statusDetails":null}' + string: '{"endTime":null,"error":null,"jobId":"ddd5713e65594a7da0f01a23de7216b2","startTime":1623796145,"status":"InProgress","statusDetails":null}' headers: - azure-asyncoperation: https://managedhsm/restore/4fcf1426713543abb14fd9360dd40754/pending + azure-asyncoperation: https://managedhsm/restore/ddd5713e65594a7da0f01a23de7216b2/pending cache-control: no-cache content-length: '138' content-security-policy: default-src 'self' content-type: application/json; charset=utf-8 - date: Wed, 09 Jun 2021 18:13:30 GMT + date: Tue, 15 Jun 2021 22:29:05 GMT server: Kestrel strict-transport-security: max-age=31536000; includeSubDomains x-content-type-options: nosniff x-frame-options: SAMEORIGIN - x-ms-keyvault-network-info: conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; - x-ms-keyvault-region: centralus - x-ms-server-latency: '2144' + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2440' status: code: 202 message: '' @@ -132,56 +132,56 @@ interactions: body: null headers: User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: GET - uri: https://managedhsm/restore/4fcf1426713543abb14fd9360dd40754/pending + uri: https://managedhsm/restore/ddd5713e65594a7da0f01a23de7216b2/pending response: body: - string: '{"endTime":null,"error":null,"jobId":"4fcf1426713543abb14fd9360dd40754","startTime":1623262410,"status":"InProgress","statusDetails":null}' + string: '{"endTime":null,"error":null,"jobId":"ddd5713e65594a7da0f01a23de7216b2","startTime":1623796145,"status":"InProgress","statusDetails":null}' headers: cache-control: no-cache content-length: '138' content-security-policy: default-src 'self' content-type: application/json; charset=utf-8 - date: Wed, 09 Jun 2021 18:13:42 GMT + date: Tue, 15 Jun 2021 22:29:17 GMT server: Kestrel strict-transport-security: max-age=31536000; includeSubDomains x-content-type-options: nosniff x-frame-options: SAMEORIGIN x-ms-build-version: 1.0.20210520-1-d6634624-develop - x-ms-keyvault-network-info: conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; - x-ms-keyvault-region: centralus - x-ms-server-latency: '2282' + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2234' status: code: 200 message: OK - url: https://mcpatinotesthsm.managedhsm.azure.net/restore/4fcf1426713543abb14fd9360dd40754/pending + url: https://mcpatinotesthsm.managedhsm.azure.net/restore/ddd5713e65594a7da0f01a23de7216b2/pending - request: body: null headers: User-Agent: - - azsdk-python-keyvault-administration/4.0.0b4 Python/3.6.9 (Linux-5.4.72-microsoft-standard-WSL2-x86_64-with-Ubuntu-18.04-bionic) + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) method: GET - uri: https://managedhsm/restore/4fcf1426713543abb14fd9360dd40754/pending + uri: https://managedhsm/restore/ddd5713e65594a7da0f01a23de7216b2/pending response: body: - string: '{"endTime":1623262427,"error":null,"jobId":"4fcf1426713543abb14fd9360dd40754","startTime":1623262410,"status":"Succeeded","statusDetails":null}' + string: '{"endTime":1623796163,"error":null,"jobId":"ddd5713e65594a7da0f01a23de7216b2","startTime":1623796145,"status":"Succeeded","statusDetails":null}' headers: cache-control: no-cache content-length: '143' content-security-policy: default-src 'self' content-type: application/json; charset=utf-8 - date: Wed, 09 Jun 2021 18:13:49 GMT + date: Tue, 15 Jun 2021 22:29:25 GMT server: Kestrel strict-transport-security: max-age=31536000; includeSubDomains x-content-type-options: nosniff x-frame-options: SAMEORIGIN x-ms-build-version: 1.0.20210520-1-d6634624-develop - x-ms-keyvault-network-info: conn_type=Ipv4;addr=24.17.201.78;act_addr_fam=Ipv4; - x-ms-keyvault-region: centralus - x-ms-server-latency: '2154' + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2448' status: code: 200 message: OK - url: https://mcpatinotesthsm.managedhsm.azure.net/restore/4fcf1426713543abb14fd9360dd40754/pending + url: https://mcpatinotesthsm.managedhsm.azure.net/restore/ddd5713e65594a7da0f01a23de7216b2/pending version: 1 diff --git a/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration.test_example_backup_and_restore.yaml b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration.test_example_backup_and_restore.yaml new file mode 100644 index 000000000000..468f1a40c990 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration.test_example_backup_and_restore.yaml @@ -0,0 +1,284 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/backup?api-version=7.2 + response: + body: + string: '' + headers: + cache-control: + - no-cache + content-length: + - '0' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + strict-transport-security: + - max-age=31536000; includeSubDomains + www-authenticate: + - Bearer authorization="https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000", + resource="https://managedhsm.azure.net" + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-server-latency: + - '1' + status: + code: 401 + message: Unauthorized +- request: + body: '{"token": "redacted", "storageResourceUri": "https://storname.blob.core.windows.net/containerwex63hmamrkpesm"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '235' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/backup?api-version=7.2 + response: + body: + string: '{"status":"InProgress","statusDetails":null,"error":null,"startTime":1623789423,"endTime":null,"jobId":"bb817c41fcea4e0dafc2bf1fa3e059c0","azureStorageBlobContainerUri":null}' + headers: + azure-asyncoperation: + - https://managedhsm/backup/bb817c41fcea4e0dafc2bf1fa3e059c0/pending + cache-control: + - no-cache + content-length: + - '174' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 20:37:03 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2542' + status: + code: 202 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/backup/bb817c41fcea4e0dafc2bf1fa3e059c0/pending + response: + body: + string: '{"azureStorageBlobContainerUri":"https://storname.blob.core.windows.net/containerwex63hmamrkpesm/mhsm-mcpatinotesthsm-2021061520370374","endTime":1623789433,"error":null,"jobId":"bb817c41fcea4e0dafc2bf1fa3e059c0","startTime":1623789423,"status":"Succeeded","statusDetails":null}' + headers: + cache-control: + - no-cache + content-length: + - '294' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 20:37:15 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-build-version: + - 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2348' + status: + code: 200 + message: OK +- request: + body: '{"sasTokenParameters": {"token": "redacted", "storageResourceUri": "https://storname.blob.core.windows.net/containerwex63hmamrkpesm"}, + "folderToRestore": "mhsm-mcpatinotesthsm-2021061520370374"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '319' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: PUT + uri: https://managedhsm/restore?api-version=7.2 + response: + body: + string: '{"endTime":null,"error":null,"jobId":"d085c52857d54d90b3c216b8d20355ca","startTime":1623789438,"status":"InProgress","statusDetails":null}' + headers: + azure-asyncoperation: + - https://managedhsm/restore/d085c52857d54d90b3c216b8d20355ca/pending + cache-control: + - no-cache + content-length: + - '138' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 20:37:18 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2508' + status: + code: 202 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/restore/d085c52857d54d90b3c216b8d20355ca/pending + response: + body: + string: '{"endTime":null,"error":null,"jobId":"d085c52857d54d90b3c216b8d20355ca","startTime":1623789438,"status":"InProgress","statusDetails":null}' + headers: + cache-control: + - no-cache + content-length: + - '138' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 20:37:30 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-build-version: + - 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2349' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/restore/d085c52857d54d90b3c216b8d20355ca/pending + response: + body: + string: '{"endTime":1623789455,"error":null,"jobId":"d085c52857d54d90b3c216b8d20355ca","startTime":1623789438,"status":"Succeeded","statusDetails":null}' + headers: + cache-control: + - no-cache + content-length: + - '143' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 20:37:38 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-build-version: + - 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2289' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration.test_example_selective_key_restore.yaml b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration.test_example_selective_key_restore.yaml new file mode 100644 index 000000000000..3e2abcc9a5b5 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration.test_example_selective_key_restore.yaml @@ -0,0 +1,374 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-keys/4.4.0 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/keys/selective-restore-test-key45031a2b/create?api-version=7.2 + response: + body: + string: '' + headers: + cache-control: + - no-cache + content-length: + - '0' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + strict-transport-security: + - max-age=31536000; includeSubDomains + www-authenticate: + - Bearer authorization="https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000", + resource="https://managedhsm.azure.net" + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-server-latency: + - '0' + status: + code: 401 + message: Unauthorized +- request: + body: '{"kty": "RSA"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '14' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-keys/4.4.0 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/keys/selective-restore-test-key45031a2b/create?api-version=7.2 + response: + body: + string: '{"attributes":{"created":1623797343,"enabled":true,"exportable":false,"recoverableDays":90,"recoveryLevel":"Recoverable+Purgeable","updated":1623797343},"key":{"e":"AQAB","key_ops":["wrapKey","decrypt","encrypt","unwrapKey","sign","verify"],"kid":"https://managedhsm/keys/selective-restore-test-key45031a2b/755569fadcde0c7d2c2f634a76887ff1","kty":"RSA-HSM","n":"h7pkGvU2ejRfHUEoKF-ix-JjSbuaFq7Y4P4WvlnMybJo1o5B6c0adPvxDBztZt540RecfPEi4CQLkrwPtLGg_6L0nm2iIAJTIFXaUsTUKQJqgfueojpRifqSbItSPcex7sc-8gPVABW2Y1zDqsaWuTbIgfWErFF5X_A8c8-TK6aEUdeHUP0AfIyDIpoht1l84w_L8guG5k29lg8wGaT__wDcqVerhZGkRxsBoLDiJOgXTy-5Lhk14x8lRtsGudLKLggGBFAeGFbryP-q0U3FsGe2swQzGoz7xRn9ncUud-KAC6on1mdTODYXOkZgmnIDV4L5nGJCK3ukGWl6SWBP7w"}}' + headers: + cache-control: + - no-cache + content-length: + - '733' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '240' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/backup?api-version=7.2 + response: + body: + string: '' + headers: + cache-control: + - no-cache + content-length: + - '0' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + strict-transport-security: + - max-age=31536000; includeSubDomains + www-authenticate: + - Bearer authorization="https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000", + resource="https://managedhsm.azure.net" + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-server-latency: + - '1' + status: + code: 401 + message: Unauthorized +- request: + body: '{"storageResourceUri": "https://storname.blob.core.windows.net/containeruu6bhqlnypomdm7", + "token": "redacted"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '237' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/backup?api-version=7.2 + response: + body: + string: '{"status":"InProgress","statusDetails":null,"error":null,"startTime":1623797347,"endTime":null,"jobId":"31b6b0454fc94f7f908474446526e57c","azureStorageBlobContainerUri":null}' + headers: + azure-asyncoperation: + - https://managedhsm/backup/31b6b0454fc94f7f908474446526e57c/pending + cache-control: + - no-cache + content-length: + - '174' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 22:49:06 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2494' + status: + code: 202 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/backup/31b6b0454fc94f7f908474446526e57c/pending + response: + body: + string: '{"azureStorageBlobContainerUri":"https://storname.blob.core.windows.net/containeruu6bhqlnypomdm7/mhsm-mcpatinotesthsm-2021061522490750","endTime":1623797358,"error":null,"jobId":"31b6b0454fc94f7f908474446526e57c","startTime":1623797347,"status":"Succeeded","statusDetails":null}' + headers: + cache-control: + - no-cache + content-length: + - '294' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 22:49:19 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-build-version: + - 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2229' + status: + code: 200 + message: OK +- request: + body: '{"sasTokenParameters": {"storageResourceUri": "https://storname.blob.core.windows.net/containeruu6bhqlnypomdm7", + "token": "redacted"}, "folder": "mhsm-mcpatinotesthsm-2021061522490750"}' + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '312' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: PUT + uri: https://managedhsm/keys/selective-restore-test-key45031a2b/restore?api-version=7.2 + response: + body: + string: '{"endTime":null,"error":null,"jobId":"46ce6cd28e9441cf812298a062c427cd","startTime":1623797362,"status":"InProgress","statusDetails":null}' + headers: + azure-asyncoperation: + - https://managedhsm/restore/46ce6cd28e9441cf812298a062c427cd/pending + cache-control: + - no-cache + content-length: + - '138' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 22:49:22 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2599' + status: + code: 202 + message: '' +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/restore/46ce6cd28e9441cf812298a062c427cd/pending + response: + body: + string: '{"endTime":null,"error":null,"jobId":"46ce6cd28e9441cf812298a062c427cd","startTime":1623797362,"status":"InProgress","statusDetails":null}' + headers: + cache-control: + - no-cache + content-length: + - '138' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 22:49:34 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-build-version: + - 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2284' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/restore/46ce6cd28e9441cf812298a062c427cd/pending + response: + body: + string: '{"endTime":1623797379,"error":null,"jobId":"46ce6cd28e9441cf812298a062c427cd","startTime":1623797362,"status":"Succeeded","statusDetails":"Number + of successful key versions restored: 0, Number of key versions could not overwrite: + 2"}' + headers: + cache-control: + - no-cache + content-length: + - '233' + content-security-policy: + - default-src 'self' + content-type: + - application/json; charset=utf-8 + date: + - Tue, 15 Jun 2021 22:49:42 GMT + server: + - Kestrel + strict-transport-security: + - max-age=31536000; includeSubDomains + x-content-type-options: + - nosniff + x-frame-options: + - SAMEORIGIN + x-ms-build-version: + - 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: + - conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: + - canadacentral + x-ms-server-latency: + - '2237' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration_async.test_example_backup_and_restore.yaml b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration_async.test_example_backup_and_restore.yaml new file mode 100644 index 000000000000..bccbc4df2b98 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration_async.test_example_backup_and_restore.yaml @@ -0,0 +1,186 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/backup?api-version=7.2 + response: + body: + string: '' + headers: + cache-control: no-cache + content-length: '0' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + strict-transport-security: max-age=31536000; includeSubDomains + www-authenticate: Bearer authorization="https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000", + resource="https://managedhsm.azure.net" + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-server-latency: '0' + status: + code: 401 + message: Unauthorized + url: https://mcpatinotesthsm.managedhsm.azure.net/backup?api-version=7.2 +- request: + body: '{"token": "redacted", "storageResourceUri": "https://storname.blob.core.windows.net/containertpuij7qwbd5ryzl"}' + headers: + Accept: + - application/json + Content-Length: + - '235' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/backup?api-version=7.2 + response: + body: + string: '{"status":"InProgress","statusDetails":null,"error":null,"startTime":1623789496,"endTime":null,"jobId":"3561286085204770977885ced9a31fb5","azureStorageBlobContainerUri":null}' + headers: + azure-asyncoperation: https://managedhsm/backup/3561286085204770977885ced9a31fb5/pending + cache-control: no-cache + content-length: '174' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 20:38:16 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2590' + status: + code: 202 + message: '' + url: https://mcpatinotesthsm.managedhsm.azure.net/backup?api-version=7.2 +- request: + body: null + headers: + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/backup/3561286085204770977885ced9a31fb5/pending + response: + body: + string: '{"azureStorageBlobContainerUri":"https://storname.blob.core.windows.net/containertpuij7qwbd5ryzl/mhsm-mcpatinotesthsm-2021061520381674","endTime":1623789505,"error":null,"jobId":"3561286085204770977885ced9a31fb5","startTime":1623789496,"status":"Succeeded","statusDetails":null}' + headers: + cache-control: no-cache + content-length: '294' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 20:38:29 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-build-version: 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2567' + status: + code: 200 + message: OK + url: https://mcpatinotesthsm.managedhsm.azure.net/backup/3561286085204770977885ced9a31fb5/pending +- request: + body: '{"folderToRestore": "mhsm-mcpatinotesthsm-2021061520381674", "sasTokenParameters": + {"token": "redacted", "storageResourceUri": "https://storname.blob.core.windows.net/containertpuij7qwbd5ryzl"}}' + headers: + Accept: + - application/json + Content-Length: + - '319' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: PUT + uri: https://managedhsm/restore?api-version=7.2 + response: + body: + string: '{"endTime":null,"error":null,"jobId":"5d26d34875964b1c9d400c25b82a5bf4","startTime":1623789511,"status":"InProgress","statusDetails":null}' + headers: + azure-asyncoperation: https://managedhsm/restore/5d26d34875964b1c9d400c25b82a5bf4/pending + cache-control: no-cache + content-length: '138' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 20:38:31 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2564' + status: + code: 202 + message: '' + url: https://mcpatinotesthsm.managedhsm.azure.net/restore?api-version=7.2 +- request: + body: null + headers: + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/restore/5d26d34875964b1c9d400c25b82a5bf4/pending + response: + body: + string: '{"endTime":null,"error":null,"jobId":"5d26d34875964b1c9d400c25b82a5bf4","startTime":1623789511,"status":"InProgress","statusDetails":null}' + headers: + cache-control: no-cache + content-length: '138' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 20:38:43 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-build-version: 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2203' + status: + code: 200 + message: OK + url: https://mcpatinotesthsm.managedhsm.azure.net/restore/5d26d34875964b1c9d400c25b82a5bf4/pending +- request: + body: null + headers: + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.5.3 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/restore/5d26d34875964b1c9d400c25b82a5bf4/pending + response: + body: + string: '{"endTime":1623789528,"error":null,"jobId":"5d26d34875964b1c9d400c25b82a5bf4","startTime":1623789511,"status":"Succeeded","statusDetails":null}' + headers: + cache-control: no-cache + content-length: '143' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 20:38:53 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-build-version: 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '3838' + status: + code: 200 + message: OK + url: https://mcpatinotesthsm.managedhsm.azure.net/restore/5d26d34875964b1c9d400c25b82a5bf4/pending +version: 1 diff --git a/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration_async.test_example_selective_key_restore.yaml b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration_async.test_example_selective_key_restore.yaml new file mode 100644 index 000000000000..2188861da0aa --- /dev/null +++ b/sdk/keyvault/azure-keyvault-administration/tests/recordings/test_examples_administration_async.test_example_selective_key_restore.yaml @@ -0,0 +1,251 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-keys/4.4.0 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/keys/selective-restore-test-keyeb471ca8/create?api-version=7.2 + response: + body: + string: '' + headers: + cache-control: no-cache + content-length: '0' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + strict-transport-security: max-age=31536000; includeSubDomains + www-authenticate: Bearer authorization="https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000", + resource="https://managedhsm.azure.net" + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-server-latency: '1' + status: + code: 401 + message: Unauthorized + url: https://mcpatinotesthsm.managedhsm.azure.net/keys/selective-restore-test-keyeb471ca8/create?api-version=7.2 +- request: + body: '{"kty": "RSA"}' + headers: + Accept: + - application/json + Content-Length: + - '14' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-keys/4.4.0 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/keys/selective-restore-test-keyeb471ca8/create?api-version=7.2 + response: + body: + string: '{"attributes":{"created":1623797248,"enabled":true,"exportable":false,"recoverableDays":90,"recoveryLevel":"Recoverable+Purgeable","updated":1623797248},"key":{"e":"AQAB","key_ops":["wrapKey","sign","verify","encrypt","decrypt","unwrapKey"],"kid":"https://managedhsm/keys/selective-restore-test-keyeb471ca8/34023c9201ad47252856f0b3de27ed33","kty":"RSA-HSM","n":"lsBV67RlqkwhehhfOw0xPNOJt4PI6F9EnNnxzICymqJY6Kn4MmlUO2I8ahL2tBnP2s2xFU9h9cQsoIH0uulOqtUOyWt8p_vQ1D1QKKZnnFU4TUzeomTUI8o17OkgJ9uIcUh8O2Yk5igfUU2Nqkp4BFVxxwiWC0HU0wVoOEhJQ35d2Hv9ShfW2MS5b-scvsN6Gav66gj1MppmvuQ4mQgOoBPakW6HNvSEx2mlQIPJeMIGlLyxcGuknWc59Vtf2PK0lJjzZBpoPEeQ5kjWM5vy6l_a_umTxJz1jgwU1-gDWFnR5jRYRquOWTzkFmOgDdMZUvcO8PjthFen5p9d597wTQ"}}' + headers: + cache-control: no-cache + content-length: '733' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '396' + status: + code: 200 + message: OK + url: https://mcpatinotesthsm.managedhsm.azure.net/keys/selective-restore-test-keyeb471ca8/create?api-version=7.2 +- request: + body: null + headers: + Accept: + - application/json + Content-Length: + - '0' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/backup?api-version=7.2 + response: + body: + string: '' + headers: + cache-control: no-cache + content-length: '0' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + strict-transport-security: max-age=31536000; includeSubDomains + www-authenticate: Bearer authorization="https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000", + resource="https://managedhsm.azure.net" + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-server-latency: '0' + status: + code: 401 + message: Unauthorized + url: https://mcpatinotesthsm.managedhsm.azure.net/backup?api-version=7.2 +- request: + body: '{"storageResourceUri": "https://storname.blob.core.windows.net/containerrjm5mcjmdhlohml", + "token": "redacted"}' + headers: + Accept: + - application/json + Content-Length: + - '237' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: POST + uri: https://managedhsm/backup?api-version=7.2 + response: + body: + string: '{"status":"InProgress","statusDetails":null,"error":null,"startTime":1623797252,"endTime":null,"jobId":"d2df9b7e97a64b87b457c3ab1c2af826","azureStorageBlobContainerUri":null}' + headers: + azure-asyncoperation: https://managedhsm/backup/d2df9b7e97a64b87b457c3ab1c2af826/pending + cache-control: no-cache + content-length: '174' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 22:47:32 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2490' + status: + code: 202 + message: '' + url: https://mcpatinotesthsm.managedhsm.azure.net/backup?api-version=7.2 +- request: + body: null + headers: + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/backup/d2df9b7e97a64b87b457c3ab1c2af826/pending + response: + body: + string: '{"azureStorageBlobContainerUri":"https://storname.blob.core.windows.net/containerrjm5mcjmdhlohml/mhsm-mcpatinotesthsm-2021061522473215","endTime":1623797262,"error":null,"jobId":"d2df9b7e97a64b87b457c3ab1c2af826","startTime":1623797252,"status":"Succeeded","statusDetails":null}' + headers: + cache-control: no-cache + content-length: '294' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 22:47:44 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-build-version: 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2438' + status: + code: 200 + message: OK + url: https://mcpatinotesthsm.managedhsm.azure.net/backup/d2df9b7e97a64b87b457c3ab1c2af826/pending +- request: + body: '{"sasTokenParameters": {"storageResourceUri": "https://storname.blob.core.windows.net/containerrjm5mcjmdhlohml", + "token": "redacted"}, "folder": "mhsm-mcpatinotesthsm-2021061522473215"}' + headers: + Accept: + - application/json + Content-Length: + - '312' + Content-Type: + - application/json + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: PUT + uri: https://managedhsm/keys/selective-restore-test-keyeb471ca8/restore?api-version=7.2 + response: + body: + string: '{"endTime":null,"error":null,"jobId":"fa9cfececf4f490782962a93e67077ce","startTime":1623797267,"status":"InProgress","statusDetails":null}' + headers: + azure-asyncoperation: https://managedhsm/restore/fa9cfececf4f490782962a93e67077ce/pending + cache-control: no-cache + content-length: '138' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 22:47:47 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2795' + status: + code: 202 + message: '' + url: https://mcpatinotesthsm.managedhsm.azure.net/keys/selective-restore-test-keyeb471ca8/restore?api-version=7.2 +- request: + body: null + headers: + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/restore/fa9cfececf4f490782962a93e67077ce/pending + response: + body: + string: '{"endTime":null,"error":null,"jobId":"fa9cfececf4f490782962a93e67077ce","startTime":1623797267,"status":"InProgress","statusDetails":null}' + headers: + cache-control: no-cache + content-length: '138' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 22:47:59 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-build-version: 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2378' + status: + code: 200 + message: OK + url: https://mcpatinotesthsm.managedhsm.azure.net/restore/fa9cfececf4f490782962a93e67077ce/pending +- request: + body: null + headers: + User-Agent: + - azsdk-python-keyvault-administration/4.0.0b4 Python/3.9.0 (Windows-10-10.0.19041-SP0) + method: GET + uri: https://managedhsm/restore/fa9cfececf4f490782962a93e67077ce/pending + response: + body: + string: '{"endTime":1623797284,"error":null,"jobId":"fa9cfececf4f490782962a93e67077ce","startTime":1623797267,"status":"Succeeded","statusDetails":"Number + of successful key versions restored: 0, Number of key versions could not overwrite: + 3"}' + headers: + cache-control: no-cache + content-length: '233' + content-security-policy: default-src 'self' + content-type: application/json; charset=utf-8 + date: Tue, 15 Jun 2021 22:48:07 GMT + server: Kestrel + strict-transport-security: max-age=31536000; includeSubDomains + x-content-type-options: nosniff + x-frame-options: SAMEORIGIN + x-ms-build-version: 1.0.20210520-1-d6634624-develop + x-ms-keyvault-network-info: conn_type=Ipv4;addr=172.92.159.124;act_addr_fam=Ipv4; + x-ms-keyvault-region: canadacentral + x-ms-server-latency: '2348' + status: + code: 200 + message: OK + url: https://mcpatinotesthsm.managedhsm.azure.net/restore/fa9cfececf4f490782962a93e67077ce/pending +version: 1 diff --git a/sdk/keyvault/azure-keyvault-administration/tests/test_backup_client.py b/sdk/keyvault/azure-keyvault-administration/tests/test_backup_client.py index 5f9ec07314f2..c8ed3b942c3d 100644 --- a/sdk/keyvault/azure-keyvault-administration/tests/test_backup_client.py +++ b/sdk/keyvault/azure-keyvault-administration/tests/test_backup_client.py @@ -2,7 +2,6 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # ------------------------------------ -from datetime import datetime from functools import partial import time @@ -11,7 +10,7 @@ from azure.identity import DefaultAzureCredential from azure.keyvault.keys import KeyClient from azure.keyvault.administration._internal import HttpChallengeCache -from azure.keyvault.administration import KeyVaultBackupClient, KeyVaultBackupOperation +from azure.keyvault.administration import KeyVaultBackupClient from azure.keyvault.administration._internal import parse_folder_url from devtools_testutils import ResourceGroupPreparer, StorageAccountPreparer import pytest @@ -53,11 +52,42 @@ def test_full_backup_and_restore(self, container_uri, sas_token): backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) backup_poller = backup_client.begin_backup(container_uri, sas_token) backup_operation = backup_poller.result() + assert backup_operation.folder_url # restore the backup restore_poller = backup_client.begin_restore(backup_operation.folder_url, sas_token) restore_poller.wait() + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) + @StorageAccountPreparer(random_name_enabled=True) + @BlobContainerPreparer() + def test_full_backup_and_restore_rehydration(self, container_uri, sas_token): + if not self.is_live: + pytest.skip("Poller requests are incompatible with vcrpy in playback") + + # backup the vault + backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) + backup_poller = backup_client.begin_backup(container_uri, sas_token) + + # create a new poller from a continuation token + token = backup_poller.continuation_token() + rehydrated = backup_client.begin_backup(container_uri, sas_token, continuation_token=token) + + rehydrated_operation = rehydrated.result() + assert rehydrated_operation.folder_url + backup_operation = backup_poller.result() + assert backup_operation.folder_url == rehydrated_operation.folder_url + + # restore the backup + restore_poller = backup_client.begin_restore(backup_operation.folder_url, sas_token) + + # create a new poller from a continuation token + token = restore_poller.continuation_token() + rehydrated = backup_client.begin_restore(backup_operation.folder_url, sas_token, continuation_token=token) + + rehydrated.wait() + restore_poller.wait() + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) @StorageAccountPreparer(random_name_enabled=True) @BlobContainerPreparer() @@ -82,24 +112,54 @@ def test_selective_key_restore(self, container_uri, sas_token): delete_poller.wait() key_client.purge_deleted_key(key_name) + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) + @StorageAccountPreparer(random_name_enabled=True) + @BlobContainerPreparer() + def test_backup_client_polling(self, container_uri, sas_token): + if not self.is_live: + pytest.skip("Poller requests are incompatible with vcrpy in playback") + + # backup the vault + backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) + backup_poller = backup_client.begin_backup(container_uri, sas_token) + + # create a new poller from a continuation token + token = backup_poller.continuation_token() + rehydrated = backup_client.begin_backup(container_uri, sas_token, continuation_token=token) + + # check that pollers and polling methods behave as expected + assert backup_poller.status() == "InProgress" + assert not backup_poller.done() or backup_poller.polling_method().finished() + assert rehydrated.status() == "InProgress" + assert not rehydrated.done() or rehydrated.polling_method().finished() + + backup_operation = backup_poller.result() + assert backup_poller.status() == "Succeeded" and backup_poller.polling_method().status() == "Succeeded" + rehydrated_operation = rehydrated.result() + assert rehydrated.status() == "Succeeded" and rehydrated.polling_method().status() == "Succeeded" + assert backup_operation.folder_url == rehydrated_operation.folder_url + + # rehydrate a poller with a continuation token of a completed operation + late_rehydrated = backup_client.begin_backup(container_uri, sas_token, continuation_token=token) + assert late_rehydrated.status() == "Succeeded" -def test_continuation_token(): - """Methods returning pollers should accept continuation tokens""" + # restore the backup + restore_poller = backup_client.begin_restore(backup_operation.folder_url, sas_token) - expected_token = "token" - mock_generated_client = mock.Mock() + # create a new poller from a continuation token + token = restore_poller.continuation_token() + rehydrated = backup_client.begin_restore(backup_operation.folder_url, sas_token, continuation_token=token) - backup_client = KeyVaultBackupClient("vault-url", object()) - backup_client._client = mock_generated_client - backup_client.begin_restore("storage uri", "sas", continuation_token=expected_token) - backup_client.begin_backup("storage uri", "sas", continuation_token=expected_token) - backup_client.begin_restore("storage uri", "sas", key_name="key", continuation_token=expected_token) + # check that pollers and polling methods behave as expected + assert restore_poller.status() == "InProgress" + assert not restore_poller.done() or restore_poller.polling_method().finished() + assert rehydrated.status() == "InProgress" + assert not rehydrated.done() or rehydrated.polling_method().finished() - for method in ("begin_full_backup", "begin_full_restore_operation", "begin_selective_key_restore_operation"): - mock_method = getattr(mock_generated_client, method) - assert mock_method.call_count == 1 - _, kwargs = mock_method.call_args - assert kwargs["continuation_token"] == expected_token + rehydrated.wait() + assert rehydrated.status() == "Succeeded" and rehydrated.polling_method().status() == "Succeeded" + restore_poller.wait() + assert restore_poller.status() == "Succeeded" and restore_poller.polling_method().status() == "Succeeded" @pytest.mark.parametrize( diff --git a/sdk/keyvault/azure-keyvault-administration/tests/test_backup_client_async.py b/sdk/keyvault/azure-keyvault-administration/tests/test_backup_client_async.py index 4c132d262f10..6a0f10979e88 100644 --- a/sdk/keyvault/azure-keyvault-administration/tests/test_backup_client_async.py +++ b/sdk/keyvault/azure-keyvault-administration/tests/test_backup_client_async.py @@ -15,7 +15,6 @@ from devtools_testutils import ResourceGroupPreparer, StorageAccountPreparer import pytest -from _shared.helpers_async import get_completed_future from _shared.test_case_async import KeyVaultTestCase from blob_container_preparer import BlobContainerPreparer @@ -55,11 +54,42 @@ async def test_full_backup_and_restore(self, container_uri, sas_token): backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) backup_poller = await backup_client.begin_backup(container_uri, sas_token) backup_operation = await backup_poller.result() + assert backup_operation.folder_url # restore the backup restore_poller = await backup_client.begin_restore(backup_operation.folder_url, sas_token) await restore_poller.wait() + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) + @StorageAccountPreparer(random_name_enabled=True) + @BlobContainerPreparer() + async def test_full_backup_and_restore_rehydration(self, container_uri, sas_token): + if not self.is_live: + pytest.skip("Poller requests are incompatible with vcrpy in playback") + + # backup the vault + backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) + backup_poller = await backup_client.begin_backup(container_uri, sas_token) + + # create a new poller from a continuation token + token = backup_poller.continuation_token() + rehydrated = await backup_client.begin_backup(container_uri, sas_token, continuation_token=token) + + rehydrated_operation = await rehydrated.result() + assert rehydrated_operation.folder_url + backup_operation = await backup_poller.result() + assert backup_operation.folder_url == rehydrated_operation.folder_url + + # restore the backup + restore_poller = await backup_client.begin_restore(backup_operation.folder_url, sas_token) + + # create a new poller from a continuation token + token = restore_poller.continuation_token() + rehydrated = await backup_client.begin_restore(backup_operation.folder_url, sas_token, continuation_token=token) + + await rehydrated.wait() + await restore_poller.wait() + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) @StorageAccountPreparer(random_name_enabled=True) @BlobContainerPreparer() @@ -82,33 +112,51 @@ async def test_selective_key_restore(self, container_uri, sas_token): await self._poll_until_no_exception(key_client.delete_key, key_name, expected_exception=ResourceExistsError) await key_client.purge_deleted_key(key_name) + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) + @StorageAccountPreparer(random_name_enabled=True) + @BlobContainerPreparer() + async def test_backup_client_polling(self, container_uri, sas_token): + if not self.is_live: + pytest.skip("Poller requests are incompatible with vcrpy in playback") -@pytest.mark.asyncio -async def test_continuation_token(): - """Methods returning pollers should accept continuation tokens""" - - expected_token = "token" - - mock_generated_client = mock.Mock() - mock_methods = [ - getattr(mock_generated_client, method_name) - for method_name in ( - "begin_full_backup", - "begin_full_restore_operation", - "begin_selective_key_restore_operation", - ) - ] - for method in mock_methods: - # the mock client's methods must return awaitables, and we don't have AsyncMock before 3.8 - method.return_value = get_completed_future() - - backup_client = KeyVaultBackupClient("vault-url", object()) - backup_client._client = mock_generated_client - await backup_client.begin_restore("storage uri", "sas", continuation_token=expected_token) - await backup_client.begin_backup("storage uri", "sas", continuation_token=expected_token) - await backup_client.begin_restore("storage uri", "sas", key_name="key", continuation_token=expected_token) - - for method in mock_methods: - assert method.call_count == 1 - _, kwargs = method.call_args - assert kwargs["continuation_token"] == expected_token + # backup the vault + backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) + backup_poller = await backup_client.begin_backup(container_uri, sas_token) + + # create a new poller from a continuation token + token = backup_poller.continuation_token() + rehydrated = await backup_client.begin_backup(container_uri, sas_token, continuation_token=token) + + # check that pollers and polling methods behave as expected + assert backup_poller.status() == "InProgress" + assert not backup_poller.done() or backup_poller.polling_method().finished() + assert rehydrated.status() == "InProgress" + assert not rehydrated.done() or rehydrated.polling_method().finished() + + backup_operation = await backup_poller.result() + assert backup_poller.status() == "Succeeded" and backup_poller.polling_method().status() == "Succeeded" + rehydrated_operation = await rehydrated.result() + assert rehydrated.status() == "Succeeded" and rehydrated.polling_method().status() == "Succeeded" + assert backup_operation.folder_url == rehydrated_operation.folder_url + + # rehydrate a poller with a continuation token of a completed operation + late_rehydrated = await backup_client.begin_backup(container_uri, sas_token, continuation_token=token) + assert late_rehydrated.status() == "Succeeded" + + # restore the backup + restore_poller = await backup_client.begin_restore(backup_operation.folder_url, sas_token) + + # create a new poller from a continuation token + token = restore_poller.continuation_token() + rehydrated = await backup_client.begin_restore(backup_operation.folder_url, sas_token, continuation_token=token) + + # check that pollers and polling methods behave as expected + assert restore_poller.status() == "InProgress" + assert not restore_poller.done() or restore_poller.polling_method().finished() + assert rehydrated.status() == "InProgress" + assert not rehydrated.done() or rehydrated.polling_method().finished() + + await rehydrated.wait() + assert rehydrated.status() == "Succeeded" and rehydrated.polling_method().status() == "Succeeded" + await restore_poller.wait() + assert restore_poller.status() == "Succeeded" and restore_poller.polling_method().status() == "Succeeded" diff --git a/sdk/keyvault/azure-keyvault-administration/tests/test_examples_administration.py b/sdk/keyvault/azure-keyvault-administration/tests/test_examples_administration.py new file mode 100644 index 000000000000..432558aa7693 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-administration/tests/test_examples_administration.py @@ -0,0 +1,98 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import time + +from azure.core.credentials import AccessToken +from azure.identity import DefaultAzureCredential +from azure.keyvault.administration._internal import HttpChallengeCache +from azure.keyvault.administration import KeyVaultBackupClient +from azure.keyvault.keys import KeyClient +from devtools_testutils import ResourceGroupPreparer, StorageAccountPreparer +import pytest +from six.moves.urllib_parse import urlparse + +from _shared.helpers import mock +from _shared.test_case import KeyVaultTestCase +from blob_container_preparer import BlobContainerPreparer + + +@pytest.mark.usefixtures("managed_hsm") +class TestExamplesTests(KeyVaultTestCase): + def __init__(self, *args, **kwargs): + super(TestExamplesTests, self).__init__(*args, match_body=False, **kwargs) + + def setUp(self, *args, **kwargs): + if self.is_live: + real = urlparse(self.managed_hsm["url"]) + playback = urlparse(self.managed_hsm["playback_url"]) + self.scrubber.register_name_pair(real.netloc, playback.netloc) + super(TestExamplesTests, self).setUp(*args, **kwargs) + + def tearDown(self): + HttpChallengeCache.clear() + assert len(HttpChallengeCache._cache) == 0 + super(KeyVaultTestCase, self).tearDown() + + @property + def credential(self): + if self.is_live: + return DefaultAzureCredential() + return mock.Mock(get_token=lambda *_, **__: AccessToken("secret", time.time() + 3600)) + + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) + @StorageAccountPreparer(random_name_enabled=True) + @BlobContainerPreparer() + def test_example_backup_and_restore(self, container_uri, sas_token): + backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) + + # [START begin_backup] + # begin a vault backup + backup_poller = backup_client.begin_backup(container_uri, sas_token) + + # check if the backup completed + done = backup_poller.done() + + # block until the backup completes + # result() returns an object with a URL of the backup + backup_operation = backup_poller.result() + # [END begin_backup] + + folder_url = backup_operation.folder_url + + # [START begin_restore] + # begin a full vault restore + restore_poller = backup_client.begin_restore(folder_url, sas_token) + + # check if the restore completed + done = backup_poller.done() + + # wait for the restore to complete + restore_poller.wait() + # [END begin_restore] + + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) + @StorageAccountPreparer(random_name_enabled=True) + @BlobContainerPreparer() + def test_example_selective_key_restore(self, container_uri, sas_token): + # create a key to selectively restore + key_client = KeyClient(self.managed_hsm["url"], self.credential) + key_name = self.get_resource_name("selective-restore-test-key") + key_client.create_rsa_key(key_name) + + backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) + backup_poller = backup_client.begin_backup(container_uri, sas_token) + backup_operation = backup_poller.result() + folder_url = backup_operation.folder_url + + # [START begin_selective_restore] + # begin a restore of a single key from a backed up vault + restore_poller = backup_client.begin_restore(folder_url, sas_token, key_name=key_name) + + # check if the restore completed + done = backup_poller.done() + + # wait for the restore to complete + restore_poller.wait() + # [END begin_selective_restore] diff --git a/sdk/keyvault/azure-keyvault-administration/tests/test_examples_administration_async.py b/sdk/keyvault/azure-keyvault-administration/tests/test_examples_administration_async.py new file mode 100644 index 000000000000..45809f90f6c3 --- /dev/null +++ b/sdk/keyvault/azure-keyvault-administration/tests/test_examples_administration_async.py @@ -0,0 +1,102 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ +import time +from unittest import mock +from urllib.parse import urlparse + +from azure.core.credentials import AccessToken +from azure.identity.aio import DefaultAzureCredential +from azure.keyvault.administration._internal import HttpChallengeCache +from azure.keyvault.administration.aio import KeyVaultBackupClient +from azure.keyvault.keys.aio import KeyClient +from devtools_testutils import ResourceGroupPreparer, StorageAccountPreparer +import pytest + +from _shared.test_case_async import KeyVaultTestCase +from blob_container_preparer import BlobContainerPreparer + + +@pytest.mark.usefixtures("managed_hsm") +class TestExamplesTests(KeyVaultTestCase): + def __init__(self, *args, **kwargs): + super().__init__(*args, match_body=False, **kwargs) + + def setUp(self, *args, **kwargs): + if self.is_live: + real = urlparse(self.managed_hsm["url"]) + playback = urlparse(self.managed_hsm["playback_url"]) + self.scrubber.register_name_pair(real.netloc, playback.netloc) + super().setUp(*args, **kwargs) + + def tearDown(self): + HttpChallengeCache.clear() + assert len(HttpChallengeCache._cache) == 0 + super(KeyVaultTestCase, self).tearDown() + + @property + def credential(self): + if self.is_live: + return DefaultAzureCredential() + + async def get_token(*_, **__): + return AccessToken("secret", time.time() + 3600) + + return mock.Mock(get_token=get_token) + + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) + @StorageAccountPreparer(random_name_enabled=True) + @BlobContainerPreparer() + async def test_example_backup_and_restore(self, container_uri, sas_token): + backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) + + # [START begin_backup] + # begin a vault backup + backup_poller = await backup_client.begin_backup(container_uri, sas_token) + + # check if the backup completed + done = backup_poller.done() + + # yield until the backup completes + # result() returns an object with a URL of the backup + backup_operation = await backup_poller.result() + # [END begin_backup] + + folder_url = backup_operation.folder_url + + # [START begin_restore] + # begin a full vault restore + restore_poller = await backup_client.begin_restore(folder_url, sas_token) + + # check if the restore completed + done = backup_poller.done() + + # wait for the restore to complete + await restore_poller.wait() + # [END begin_restore] + + @ResourceGroupPreparer(random_name_enabled=True, use_cache=True) + @StorageAccountPreparer(random_name_enabled=True) + @BlobContainerPreparer() + async def test_example_selective_key_restore(self, container_uri, sas_token): + # create a key to selectively restore + key_client = KeyClient(self.managed_hsm["url"], self.credential) + key_name = self.get_resource_name("selective-restore-test-key") + await key_client.create_rsa_key(key_name) + + backup_client = KeyVaultBackupClient(self.managed_hsm["url"], self.credential) + backup_poller = await backup_client.begin_backup(container_uri, sas_token) + backup_operation = await backup_poller.result() + folder_url = backup_operation.folder_url + + # [START begin_selective_restore] + # begin a restore of a single key from a backed up vault + restore_poller = await backup_client.begin_restore(folder_url, sas_token, key_name=key_name) + + # check if the restore completed + done = backup_poller.done() + + # wait for the restore to complete + await restore_poller.wait() + # [END begin_selective_restore]